“for循环”与两个variables?

如何在同一个循环中包含两个variables?

 t1 = [a list of integers, strings and lists] t2 = [another list of integers, strings and lists] def f(t): #a function that will read lists "t1" and "t2" and return all elements that are identical for i in range(len(t1)) and for j in range(len(t2)): ... 

如果你想要嵌套for循环的效果,使用:

 import itertools for i, j in itertools.product(range(x), range(y)): # Stuff... 

如果您只想同时循环,请使用:

 for i, j in zip(range(x), range(y)): # Stuff... 

请注意,如果xy的长度不相同,则zip将截断为最短的列表。 正如@abarnert指出的那样,如果你不想截短到最短的列表,你可以使用itertools.zip_longest

UPDATE

根据“将读取列表”t1和“t2”并返回所有相同的元素“的函数的请求,我不认为OP需要zip product 。 我想他们想要set

 def equal_elements(t1, t2): return list(set(t1).intersection(set(t2))) # You could also do # return list(set(t1) & set(t2)) 

一个setintersection方法将返回它和另一个集合的所有元素(注意,如果你的列表包含其他list ,你可能想先将内部list转换为tuples以便它们是可哈希的;否则,调用set将失败)。 listfunction然后将设置变回列表。

更新2

或者,OP可能需要在列表的相同位置上相同的元素。 在这种情况下, zip将是最合适的,并且它截断到最短列表的事实是你想要的(因为当列表中的一个仅有5个元素时,在索引9处不可能有相同的元素)。 如果这就是你想要的,那就去吧:

 def equal_elements(t1, t2): return [x for x, y in zip(t1, t2) if x == y] 

这将返回一个列表,只包含列表中相同位置的元素。

任何原因你不能使用嵌套for循环?

 for i in range(x): for j in range(y): 

这里有两个可能的问题:如何同时迭代这些variables,或者如何循环遍历它们的组合

幸运的是,两者都有简单的答案。 第一种情况,你想使用zip

 x = [1, 2, 3] y = [4, 5, 6] for i, j in zip(x, y): print i + " / " + j 

会输出

 1 / 4 2 / 5 3 / 6 

请记住,你可以把任何可压缩zip ,所以你可以很容易地写你的例子:

 for i, j in zip(range(x), range(y)): # do work here. 

其实刚刚意识到这是行不通的。 它只会迭代,直到更小的范围用完。 在这种情况下,这听起来像是你想迭代循环的组合。

在另一种情况下,你只需要一个嵌套的循环。

 for i in x: for j in y: print i + " / " + j 

给你

 1 / 4 1 / 5 1 / 6 2 / 4 2 / 5 ... 

你也可以做这个列表理解。

 [i + " / " + j for i in range(x) for j in range(y)] 

希望有所帮助。

 for (i,j) in [(i,j) for i in range(x) for j in range(y)] 

应该这样做。

如果你真的只是在一个范围内进行锁步迭代,你可以通过以下几种方法之一来完成:

 for i in range(x): j = i … # or for i, j in enumerate(range(x)): … # or for i, j in ((i,i) for i in range(x)): … 

如果x <= y ,则上述所有等价for i, j in zip(range(x), range(y))

如果你想要一个嵌套循环,并且只有两个迭代器,只需使用一个嵌套循环:

 for i in range(x): for i in range(y): … 

如果你有两个以上的iterables,使用itertools.product

最后,如果你想锁步迭代到x ,然后继续y ,你必须决定其余的x值应该是什么。

 for i, j in itertools.zip_longest(range(x), range(y), fillvalue=float('nan')): … # or for i in range(min(x,y)): j = i … for i in range(min(x,y), max(x,y)): j = float('nan') … 

我想你正在寻找嵌套循环。

示例(根据您的编辑):

 t1=[1,2,'Hello',(1,2),999,1.23] t2=[1,'Hello',(1,2),999] t3=[] for it1, e1 in enumerate(t1): for it2, e2 in enumerate(t2): if e1==e2: t3.append((it1,it2,e1)) # t3=[(0, 0, 1), (2, 1, 'Hello'), (3, 2, (1, 2)), (4, 3, 999)] 

这可以归结为一个单一的理解:

 [(it1,it2,e1) for it1, e1 in enumerate(t1) for it2, e2 in enumerate(t2) if e1==e2] 

但要find共同的元素,你可以做:

 print set(t1) & set(t2) # set([(1, 2), 1, 'Hello', 999]) 

如果你的列表包含不可哈希的对象(像其他列表,字典)使用冻结集:

 from collections import Iterable s1=set(frozenset(e1) if isinstance(e1,Iterable) else e1 for e1 in t1) s2=set(frozenset(e2) if isinstance(e2,Iterable) else e2 for e2 in t2) print s1 & s2 

“Python 3”

使用zip和range添加2个variablesfor循环; 返回一个列表。

注意:只会运行到最小范围结束。

 >>>a=[g+h for g,h in zip(range(10), range(10))] >>>a >>>[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]