“for loop”有两个变量?

时间:2013-09-06 01:48:30

标签: python 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)):
        ...

8 个答案:

答案 0 :(得分:160)

如果您想要嵌套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))

intersection的{​​{1}}方法会返回它共有的所有元素和另一组(请注意,如果您的列表包含其他set,您可能想要转换内部首先listlist以便它们可以播放;否则对tuples的调用将失败。)然后set函数将集合转回列表。

更新2

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

zip

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

答案 1 :(得分:25)

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

幸运的是,两者都有简单的答案。首先,您要使用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)]

希望有所帮助。

答案 2 :(得分:19)

你有什么理由不能使用嵌套的for循环吗?

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

答案 3 :(得分:11)

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

应该这样做。

答案 4 :(得分:7)

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

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)):
  …

以上所有内容均相当于for i, j in zip(range(x), range(y)) x <= 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')
  …

答案 5 :(得分:4)

“Python 3。”

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

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

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

答案 6 :(得分:3)

我认为你正在寻找嵌套循环。

示例(基于您的编辑):

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])

如果您的列表包含不可清除的对象(如其他列表,dicts),请使用冻结集:

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

答案 7 :(得分:2)

对于您的用例,使用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

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