Python 两个列表的笛卡尔乘积能否返回除包含两个相同元素的组合之外的所有组合?
比如说 嵌套=[a,b,c] 上述列表的笛卡尔积本身将生成以下对 [a,a,a,b,a,c,b,a,b,b,c,b,b,c,a,c,b,b,c,c] 我想找到一种方法来生成以下内容 [a,b,a,c,b,a,b,c,c,a,c,b] 我尝试了以下方法 [x,y表示嵌套中的x,如果x!=y,则y表示嵌套中的y] 对于以下测试用例,上述代码失败Python 两个列表的笛卡尔乘积能否返回除包含两个相同元素的组合之外的所有组合?,python,python-3.x,cartesian-product,Python,Python 3.x,Cartesian Product,比如说 嵌套=[a,b,c] 上述列表的笛卡尔积本身将生成以下对 [a,a,a,b,a,c,b,a,b,b,c,b,b,c,a,c,b,b,c,c] 我想找到一种方法来生成以下内容 [a,b,a,c,b,a,b,c,c,a,c,b] 我尝试了以下方法 [x,y表示嵌套中的x,如果x!=y,则y表示嵌套中的y] 对于以下测试用例,上述代码失败 nested_testcase1 = [[1,2],[2,3],[1,2]] 现在,上面的代码行将给出以下结果 [1,2]、[2,3]、[2,3]、[1,
nested_testcase1 = [[1,2],[2,3],[1,2]]
现在,上面的代码行将给出以下结果
[1,2]、[2,3]、[2,3]、[1,2]、[1,2]、[2,3]、[2,3]、[1,2]]
但我想说的是以下几点
[1,2]、[2,3]、[2,3]、[1,2]、[1,2]、[2,3]、[1,2]、[1,2]、[1,2]、[1,2]、[1,2]、[1,2]]
最后两个组合通过配对第一个和最后一个元素来实现
有人有什么想法吗?一个简单的改变:使用对象引用,而不是值:
>>> [(x,y) for x in nested for y in nested if id(x) is not id(y)]
[([1, 2], [2, 3]), ([1, 2], [1, 2]), ([2, 3], [1, 2]), ([2, 3], [1, 2]), ([1, 2], [1, 2]), ([1, 2], [2, 3])]
您可以使用索引而不是检查值,如:
[(x, y) for i, x in enumerate(data) for j, y in enumerate(data) if i != j]
例如:
>>> [(x, y) for i, x in enumerate(data) for j, y in enumerate(data) if i != j]
[('a', 'b'), ('a', 'c'), ('b', 'a'), ('b', 'c'), ('c', 'a'), ('c', 'b')]
>>> data = [[1,2],[2,3],[1,2]]
>>> [(x, y) for i, x in enumerate(data) for j, y in enumerate(data) if i != j]
[([1, 2], [2, 3]), ([1, 2], [1, 2]), ([2, 3], [1, 2]), ([2, 3], [1, 2]), ([1, 2], [1, 2]), ([1, 2], [2, 3])]
用itertools排列试试吧
import itertools
list(itertools.permutations(['a','b','c'], r=2))
输出是你喜欢的
[('a', 'b'), ('a', 'c'), ('b', 'a'), ('b', 'c'), ('c', 'a'), ('c', 'b')]
这也适用于您的情况:
list(itertools.permutations([[1,2],[2,3],[1,2]], 2))
输出是
[([1, 2], [2, 3]), ([1, 2], [1, 2]), ([2, 3], [1, 2]), ([2, 3], [1, 2]), ([1, 2], [1, 2]), ([1, 2], [2, 3])]
参考请看这里:
我打算建议使用索引,但这要优雅得多。您也可以使用x不是y,而不是比较idx和idy@Heike:谢谢你帮我解决了大脑冻结问题。由于种种原因,它并不优越。