python “for循环”有两个变量?[重复]

7d7tgy0s  于 2022-12-25  发布在  Python
关注(0)|答案(8)|浏览(204)
    • 此问题在此处已有答案**:

How do I iterate through two lists in parallel?(8个答案)
两年前关闭了。
如何在同一个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)):
        ...
zfciruhq

zfciruhq1#

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

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]

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

vuktfyat

vuktfyat2#

这里有两个可能的问题:如何同时迭代这些变量,或者如何循环遍历它们的组合。
幸运的是,这两种情况都有简单的答案:第一种情况,您希望使用zip

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

for i, j in zip(x, y):
   print(str(i) + " / " + str(j))

意志输出
请记住,您可以在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))

给你
您也可以将其作为列表解析来执行。

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

tp5buhyn3#

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

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

nlejzf6q4#

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

应该可以。

5q4ezhmt

5q4ezhmt5#

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

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')
  …
tez616oj

tez616oj6#

“巨蟒3号”
使用zip和range在for循环中添加2个变量;返回列表。
注:将仅运行到最小范围结束。

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

holgip5t7#

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

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

k5ifujac

k5ifujac8#

我认为您正在寻找嵌套循环。
示例(基于您的编辑):

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

相关问题