是否有更好的方法遍历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
答案 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
是一个迭代器,它一次返回list1
和list2
的叉积元素。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