“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...
请注意,如果x
和y
的长度不相同,则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))
一个set
的intersection
方法将返回它和另一个集合的所有元素(注意,如果你的列表包含其他list
,你可能想先将内部list
转换为tuples
以便它们是可哈希的;否则,调用set
将失败)。 list
function然后将设置变回列表。
更新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]