有两个变量的“ for loop”?

如何在同一个 for循环中包含两个变量?

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)):
...
710436 次浏览
for (i,j) in [(i,j) for i in range(x) for j in range(y)]

应该可以。

为什么不能使用嵌套的 for 循环?

for i in range(x):
for j in range(y):
#code that uses i and j

如果希望获得嵌套 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

更新

基于对“一个函数将读取列表“ 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的调用将失败).然后,list函数将集合返回到一个列表。

更新2

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

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

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

这里有两个可能的问题: 如何迭代这些变量 同时,或者如何循环它们的 密码

幸运的是,这两个问题都有简单的答案。

x = [1, 2, 3]
y = [4, 5, 6]


for i, j in zip(x, y):
print(str(i) + " / " + str(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(str(i) + " / " + str(j))

给你

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

你也可以作为列表内涵来做这件事。

[str(i) + " / " + str(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):
…

如果有两个以上的可迭代文件,请使用 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]

但要找到共同点,你可以这样做:

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

巨蟒3

使用 zip 和 range 添加带 for 循环的2个 vars; 返回一个列表。

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

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

对于您的用例,利用 while循环可能更容易。

t1 = [137, 42]
t2 = ["Hello", "world"]


i = 0
j = 0
while i < len(t1) and j < len(t2):
print t1[i], t2[j]
i += 1
j += 1


# 137 Hello
# 42 world

作为一个警告,这种方法将截断到您的最短列表的长度。