gpt4 book ai didi

python - Itertools 无序笛卡尔积

转载 作者:行者123 更新时间:2023-12-01 00:46:07 30 4
gpt4 key购买 nike

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

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

<小时/>

我想对列表中的所有索引进行排列。

例如,对于列表 ['a', 'b', 'c'],我想迭代索引 ij这样我就可以将“a”与“a”、“b”、“c”等进行比较。

这基本上只是两个嵌套的 for 循环,因此来自 itertools 的 product 很好地实现了这一点。

但它所做的工作基本上是我需要的工作的两倍。我只需要上三角 (i, j) 对(因此,无序对 - 例如如果迭代 (0,1),则不需要 (1,0))。

我认为这肯定是一个已经回答的问题,但我找不到它。您能帮忙回答吗?或者,如果这是重复的,请为我指出正确的方向?谢谢!

<小时/>

我有:

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]

最佳答案

执行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]

关于python - Itertools 无序笛卡尔积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56962679/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com