编辑:user2357112正确地将我的问题标记为重复。链接的答案适用于我的问题。
我将保留这个问题,因为我认为它的措辞与链接的问题不同,并且可能有助于其他人到达正确的位置。
我想获取列表中所有索引之间的置换。
例如,对于列表['a','b','c'],我要遍历索引i
和j
,以便可以将'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]
答案 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]