Python3中的双循环

时间:2016-09-12 09:12:36

标签: python python-3.x permutation

有名为L.的清单 其中包含其他列表:L = [A,B,C,... N] 我想for-loop,其中B不等于A(见#2) 类似的东西:因为B在L中不是A:

for A in L: #1
    for B in L: #2

我该怎么做?

3 个答案:

答案 0 :(得分:0)

只需按索引访问列表的其余部分:

for i in xrange(len(L)-1):
    for j in xrange(i+1, len(L)):
        #L[i] != L[j] always, and will check just one list against the others once

答案 1 :(得分:0)

使用itertools with permutationswith combinations

的更好解决方案
import itertools

# If it's okay to see L[1], L[2], and later L[2], L[1], that is, order sensitive,
# matching your original question's specification of only avoiding pairing with self:
for A, B in itertools.permutations(L, 2):
    ...

# If you only want to see L[x] paired with L[y] where y > x,
# equivalent to results of Daniel Sanchez's answer:
for A, B in itertools.combinations(L, 2):
    ...

其中任何一个都比使用需要索引的嵌套循环要快得多(并且奖励,只需要一个级别的缩进,减少"箭头模式"在您的代码中)。

如果循环体是print(A, B, sep=',', end=' ')L = [1, 2, 3]permutations循环的输出将为:

1,2 1,3 2,1 2,3 3,1 3,2

combinations,你得到:

1,2 1,3 2,3

所以请选择符合您所期望的行为。

使用itertools函数的另一个好处是,当L是非序列集合(例如set)时,它们可以正常工作,或者当它是&{ #39;是一个只能遍历一次的迭代器(它们会在内部缓存这些值,因此它们可以多次生成它们)。其他解决方案需要显式转换为list / tuple等来处理" L是一次使用的迭代器"情况下。

答案 2 :(得分:0)

您可以使用if语句过滤掉您不想要的案例:

for A in L:
    for B in L:
        if A == B:
            continue # skip
        # do stuff ...