有名为L.的清单 其中包含其他列表:L = [A,B,C,... N] 我想for-loop,其中B不等于A(见#2) 类似的东西:因为B在L中不是A:
for A in L: #1
for B in L: #2
我该怎么做?
答案 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 permutations
或with 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 ...