"for loop"有两个变量?

Que*_*ter 106 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)):
        ...
Run Code Online (Sandbox Code Playgroud)

Set*_*ton 177

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

import itertools
for i, j in itertools.product(range(x), range(y)):
    # Stuff...
Run Code Online (Sandbox Code Playgroud)

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

for i, j in zip(range(x), range(y)):
    # Stuff...
Run Code Online (Sandbox Code Playgroud)

需要注意的是,如果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))
Run Code Online (Sandbox Code Playgroud)

a的intersection方法set将返回它共有的所有元素和另一个集合(请注意,如果您的列表包含其他lists,您可能希望将内部lists 转换为tuplesfirst,以便它们可以清除;否则调用set将失败.).list然后,该功能将设置变回列表.

更新2

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

def equal_elements(t1, t2):
    return [x for x, y in zip(t1, t2) if x == y]
Run Code Online (Sandbox Code Playgroud)

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

  • -1"zip"答案不合格.正如我在上面评论的那样,它只适用于`x == y`这里. (3认同)
  • @Quester您可以使用`itertools.izip`,这基本上是相同的.除此之外,不是我所知道的.但是`zip`有什么问题? (3认同)
  • @kojiro:嗯,OP没有说明`x!= y`会发生什么.一旦他解释了,答案就是`zip`或`itertools.zip_longest`. (2认同)

Mor*_*ris 34

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

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

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

for i, j in zip(x, y):
   print(str(i) + " / " + str(j))
Run Code Online (Sandbox Code Playgroud)

将输出

1 / 4
2 / 5
3 / 6
Run Code Online (Sandbox Code Playgroud)

请记住,您可以将任何可迭代内容放入其中zip,因此您可以轻松编写以下内容:

for i, j in zip(range(x), range(y)):
    # do work here.
Run Code Online (Sandbox Code Playgroud)

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

在另一种情况下,您只需要一个嵌套循环.

for i in x:
    for j in y:
        print(str(i) + " / " + str(j))
Run Code Online (Sandbox Code Playgroud)

给你

1 / 4
1 / 5
1 / 6
2 / 4
2 / 5
...
Run Code Online (Sandbox Code Playgroud)

您也可以将此作为列表理解.

[str(i) + " / " + str(j) for i in range(x) for j in range(y)]
Run Code Online (Sandbox Code Playgroud)

希望有所帮助.


Jag*_*ags 20

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

for i in range(x):
   for j in range(y):
       #code that uses i and j
Run Code Online (Sandbox Code Playgroud)

  • @Quester:你可以使用`product`代替,就像SethMMorton的回答一样.如果您有六个范围而不是两个范围,那么肯定会更优雅/可读,或者它们的数量是动态的并且仅在运行时已知.但是对于其中只有2个...为了简单起见,很难击败2个嵌套循环. (7认同)
  • @Matt:它对我来说看起来不够优雅. (4认同)
  • 嵌套循环运行i*j次.如果他想只运行i次,考虑到i == j,该怎么办? (3认同)

qap*_*hla 13

for (i,j) in [(i,j) for i in range(x) for j in range(y)]
Run Code Online (Sandbox Code Playgroud)

应该这样做.

  • 在Matt Quinlan的回答中,这只是嵌套for循环的一个难以阅读的变体. (8认同)
  • 好像开始:) (2认同)

koj*_*iro 8

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

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)):
  …
Run Code Online (Sandbox Code Playgroud)

以上所有都等同于for i, j in zip(range(x), range(y))if x <= y.

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

for i in range(x):
  for i in range(y):
    …
Run Code Online (Sandbox Code Playgroud)

如果您有两个以上的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')
  …
Run Code Online (Sandbox Code Playgroud)


小智 6

“ Python3。”

使用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]
Run Code Online (Sandbox Code Playgroud)


Dan*_*iel 6

对于您的用例,使用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
Run Code Online (Sandbox Code Playgroud)

需要注意的是,这种方法将截断到最短列表的长度。