Itertools笛卡尔积无订单

时间:2019-07-10 02:33:30

标签: python itertools

编辑:user2357112正确地将我的问题标记为重复。链接的答案适用于我的问题。

我将保留这个问题,因为我认为它的措辞与链接的问题不同,并且可能有助于其他人到达正确的位置。


我想获取列表中所有索引之间的置换。

例如,对于列表['a','b','c'],我要遍历索引ij,以便可以将'a'与' a”,“ b”,“ c”等

基本上这只是两个嵌套的for循环,因此itertools的 product 可以很好地解决问题。

但是它基本上完成了我需要做的工作的两倍。我只需要上面的三角形(i,j)对(因此,无序对- eg 如果(0,1)被迭代,则不需要(1,0))。 / p>

我认为那肯定是已经回答的事情,但是我找不到。您能帮忙回答吗,如果这是重复的话,请指向正确的方向吗?谢谢!


我所拥有的:

from itertools import product

exList = ['a', 'b', 'c']

for i,j in product(range(len(exList)), range(len(exList))):
    print([i,j])

---
Out:

[0, 0]
[0, 1]
[0, 2]
[1, 0]
[1, 1]
[1, 2]
[2, 0]
[2, 1]
[2, 2]

但这是我需要的计算的两倍,例如[0, 1][1, 0]是多余的。

因此itertools的输出是有序对。我想要一个无序的对-就像一个三角矩阵。

我想要什么:

from itertools import product

exList = ['a', 'b', 'c']

helpfulFunction(exList)

---
Out:

[0, 0]
[0, 1]
[0, 2]
[1, 1]
[1, 2]
[2, 2]

2 个答案:

答案 0 :(得分:1)

如何使用itertools.combinations_with_replacement

from itertools import combinations_with_replacement
a = ['a', 'b', 'c']
list(combinations_with_replacement(a, 2))
[(0, 0), (0, 1), (0, 2), (1, 1), (1, 2), (2, 2)]

这将允许您执行以下操作:

for i, j in combinations_with_replacement(range(len(a)), 2):
   print(i, j)

0 0
0 1
0 2
1 1
1 2
2 2

答案 1 :(得分:1)

执行if语句并过滤,如果j大于或等于i,则仅过滤print

for i,j in product(range(len(exList)), range(len(exList))):
    if j >= i:
        print([i, j])

更好:

使用combinations_with_replacement

for i, j in itertools.combinations_with_replacement(range(len(exList)), 2):
    print(i, j)

两个输出:

[0, 0]
[0, 1]
[0, 2]
[1, 1]
[1, 2]
[2, 2]