【发布时间】:2021-01-11 10:51:18
【问题描述】:
我正在尝试实现一个“i 不等于 j”(i<j) 循环,它会跳过 i = j 的情况,但我还想提出一个额外的要求,即循环不重复(j,i),如果 (i,j) 已经完成(因为由于对称性,这两种情况给出了相同的解决方案)。
第一次尝试
在接下来的代码中,我通过迭代以下列表来创建i<j 循环,其中第二个列表只是前滚的第一个列表 1:
mylist = ['a', 'b', 'c']
np.roll(mylist,2).tolist() = ['b', 'c', 'a']
下面代码生成的序列原来不是我想要的:
import numpy as np
mylist = ['a', 'b', 'c']
for i in mylist:
for j in np.roll(mylist,2).tolist():
print(i,j)
因为它返回一个重复的a a 并且有重复的排列a b 和b a:
a b
a c
a a
b b
b c
b a
c b
c c
c a
所需的序列应该是 mylist 中元素的成对组合,因为对于 N=3 元素,应该只有 N*(N-1)/2 = 3 对循环:
a b
a c
b c
【问题讨论】:
-
你可以使用 numpy stackoverflow.com/questions/15792465/…
-
np.roll会很好。如果 i 和 j 已经完成,有什么方法可以不重复 j 和 i 的排列? (因为,由于对称性,j 和 i 案例包含与 i 和 j 相同的答案) -
你能澄清你到底在问什么吗?是否要旋转列表(将所有元素向上移动,从第一个到最后一个)?你想像旋转一样在列表上进行迭代吗?您真的需要
list,还是其他序列类型(例如deque)也合适? -
问题显示实际输出。 期望的输出是什么?您在寻找pairwise permutations 吗?
-
请提供一个实际的预期输出作为打印或列表等。您在这里提到的内容对我来说并不清楚。最好尽量避免主观性。
标签: python list loops combinations permutation