带两个变量的“for循环”?

2024-04-23 14:05:45 发布

您现在位置:Python中文网/ 问答频道 /正文

如何在同一个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)):
        ...

Tags: andofintegersinforlenthatdef
3条回答

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

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

这里有两个可能的问题:如何同时遍历这些变量,或者如何遍历它们的组合。

幸运的是,两者都有简单的答案。第一种情况,您希望使用zip

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

记住,您可以将任何iterable放在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循环的效果,请使用:

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不需要zipproduct。我想他们想要一个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函数将集合转换回列表。

更新2

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

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

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

相关问题 更多 >