Python-遍历多个列表的所有实例

时间:2018-10-30 16:52:25

标签: python

是否有更好的方法遍历Python中多个列表的每个组合?例如...

list1 = [1,2,3,4]
list2 = [6,7,8]

for i in list1:
   for j in list2:
      print(str(i) + ", " + str(j))

1, 6
1, 7
1, 8
2, 6
2, 7
2, 8
3, 6
3, 7
3, 8
4, 6
4, 7
4, 8

我问,因为一旦找到值,我想跳出两个循环。我不想使用布尔标志来突破顶级循环。到目前为止,我看到的所有答案都说要使用zip,但这不是一回事。 zip会产生以下结果。

1, 6
2, 7
3, 8

如果使用地图,则会得到以下内容,这也不是我想要的。

1, 6
2, 7
3, 8
4, None

6 个答案:

答案 0 :(得分:2)

您可以像这样使用itertools.product

list1 = [1,2,3,4]
list2 = [6,7,8]
find_this_value = (1, 8)

found_value = False
for permutation in itertools.product(list1, list2):
    if permutation == find_this_value:
        found_value = True
        break

if found_value:
    pass  # Take action

itertools.product返回具有2个列表的所有可能排列的生成器。然后,您只需遍历那些,然后搜索直到找到所需的值。

答案 1 :(得分:2)

您是否尝试过使用列表理解

[(x, y) for x in [1,2,3,4]
 for y in [6,7,8]]

答案 2 :(得分:1)

如果您不想按照其他答案中的建议使用itertools.product,则可以将其包装在函数中并返回:

list1 = [1,2,3,4]
list2 = [6,7,8]

def findNumbers(x, y):
    for i in list1:
       for j in list2:
          print(str(i) + ", " + str(j))
          if (x, y) == (i, j):
              return (x, y)

输出:

>>> findNumbers(2, 7)
1, 6
1, 7
1, 8
2, 6
2, 7
(2, 7)

答案 3 :(得分:1)

如果您需要知道中断条件出现时扫描所在的位置,则可以将列表推导和enumerate一起使用

for i,a,j,b in [ x+y for x in enumerate([11,12,13,14]) for y in enumerate([16,17,18]) ]:
    print( i,a,j,b)
    if a==13 and b==17: break
print(i,j) # get 2 1

答案 4 :(得分:0)

您可以使用product函数。

您可以在here

中阅读更多内容
  

大致等同于生成器表达式中的嵌套for循环

import itertools
print (list(itertools.product(list1, list2)))
# [(1, 6), (1, 7), (1, 8), (2, 6), (2, 7), (2, 8), (3, 6), (3, 7), (3, 8), (4, 6), (4, 7), (4, 8)]

答案 5 :(得分:0)

您可能希望看到在简单代码中使用的product

  • 在这种情况下,product是一个迭代器,它一次返回list1list2的叉积元素。
  • for循环中,我们观察特定对的出现,break在循环中(如果遇到时)不在循环中。

-

>>> list1 = [1,2,3,4]
>>> list2 = [6,7,8]
>>> from itertools import product
>>> for i, j in product(list1, list2):
...     if (i,j)==(2,7):
...         print (i,j)
...         break
...     
2 7