[英]Nested loop in python to produce cartesian product
我试图在python中遍历两个列表以获取这样的输出。
list1 = [a, b, c]
list2 = [1, 2, 3]
因此,它应该为列表2上list1的每个值循环。list1 [a]将在list2上循环3次,依此类推,直到达到c。 但是,我没有得到所需的输出。
i=''
list1 = ['ABC ' + str(i)+ ' '+'1' + ' ' + '5', 'CDE '+ str(i)+ ' '+ '1'+ ' ' + '5']
list2=['123','234','456']
for c in list1:
for i in list2:
print c
输出:
ABC 1 5
ABC 1 5
ABC 1 5
CDE 1 5
CDE 1 5
CDE 1 5
所需的输出格式如下:
ABC 123 1 5
CDE 123 1 5
ABC 234 1 5
CDE 234 1 5
ABC 456 1 5
CDE 456 1 5
请指导我在这里我所缺少的,这是新的。
您需要在循环内插list2
值。 您可以使用itertools.product()
函数,而不是嵌套循环。 如果要更改list1
的值,请交换列表的顺序:
from itertools import product
list1 = ['ABC {} 1 5', 'CDE {} 1 5']
list2 = ['123','234','456']
for l2, l1 in product(list2, list1):
print l1.format(l2)
str.format()
方法用l2
值填充list1
字符串中的{}
,从而避免每次都从头开始重建list2
:
>>> for l2, l1 in product(list2, list1):
... print(l1.format(l2))
...
ABC 123 1 5
CDE 123 1 5
ABC 234 1 5
CDE 234 1 5
ABC 456 1 5
CDE 456 1 5
另一种选择是让list1
包含要使用的值的元组 ,并且仅在打印时才通过使用print()
作为函数将所有内容转换为一个字符串(Python 3或Python 2中的from __future__
import):
from __future__ import print_function
list1 = [('ABC', 1, 5), ('CDE', 1, 5)]
list2 = ['123','234','456']
for l2, (a, b, c) in product(list2, list1):
print(a, l2, b, c)
这取决于您还想对产生的值做些什么。
请注意,如果list1
的值之间的1
和5
数字不变,则根本不需要使用字符串模板或元组进行复杂的舞蹈。 您只需要在循环中引用这些内容即可:
b, c = 1, 5
list1 = ['ABC', 'CDE']
list2 = ['123','234','456']
for l2, l1 in product(list2, list1):
print '{} {} {} {}'.format(l1, l2, b, c)
我仍然使用字符串格式化只是为了展示将多个值组合到一个字符串中的另一种形式。
您需要将list1
的构造移到for循环中。 重新组织行,如下所示:
list2 = ['123', '234', '456']
for i in list2:
list1 = ['ABC ' + str(i) + ' ' + '1' + ' ' + '5',
'CDE ' + str(i) + ' ' + '1' + ' ' + '5']
for c in list1:
print c
这将打印
ABC 123 1 5
CDE 123 1 5
ABC 234 1 5
CDE 234 1 5
ABC 456 1 5
CDE 456 1 5
话虽这么说,可以使用字符串格式化来改进:
for i in list2:
list1 = ['ABC {0} 1 5', 'CDE {0} 1 5']
for c in list1:
print c.format(i)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.