两个列表的笛卡尔积可以返回除涉及两个相同元素的组合之外的所有组合吗?

Bha*_* Nc 0 python cartesian-product python-3.x

例如

nested = [a,b,c]

上面列表的笛卡尔乘积本身将生成以下对

[(a,a),(a,b),(a,c),(b,a),(b,c),(b,b),(c,a),(c,b),(c,c)]

我想找到一种方法来产生以下内容

[(a,b),(a,c),(b,a),(b,c),(c,a),(c,b)]

我尝试了以下

[(x,y) for x in nested for y in nested if x != y]

上面的代码在以下测试用例中失败

nested_testcase1 = [[1,2],[2,3],[1,2]]
Run Code Online (Sandbox Code Playgroud)

现在,上面的代码行将给出以下结果

[([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]),([2,3],[1,2]),([1,2],[1,2]),([1,2],[1,2])]

最后两个组合是通过将第一个和最后一个元素配对来实现的。

有人有什么想法吗?

che*_*Out 8

尝试使用itertools排列

import itertools
list(itertools.permutations(['a','b','c'], r=2))
Run Code Online (Sandbox Code Playgroud)

输出随心所欲

[('a', 'b'), ('a', 'c'), ('b', 'a'), ('b', 'c'), ('c', 'a'), ('c', 'b')]
Run Code Online (Sandbox Code Playgroud)

这也适用于您的情况:

list(itertools.permutations([[1,2],[2,3],[1,2]], 2))
Run Code Online (Sandbox Code Playgroud)

输出是

[([1, 2], [2, 3]), ([1, 2], [1, 2]), ([2, 3], [1, 2]), ([2, 3], [1, 2]), ([1, 2], [1, 2]), ([1, 2], [2, 3])]
Run Code Online (Sandbox Code Playgroud)

供参考,请参见:https : //docs.python.org/3.7/library/itertools.html#itertools.permutations