python中的嵌套循环生成笛卡尔积

python中的嵌套循环生成笛卡尔积,python,Python,我试图在python中循环两个列表,以获得这样的输出 list1 = [a, b, c] list2 = [1, 2, 3] 因此,它应该为列表1的每个值循环列表2。list1[a]将在list2上循环3次,以此类推,直到到达c。然而,我没有得到期望的输出 i='' list1 = ['ABC ' + str(i)+ ' '+'1' + ' ' + '5', 'CDE '+ str(i)+ ' '+ '1'+ ' ' + '5'] list2=['123','234','456'] for

我试图在python中循环两个列表,以获得这样的输出

list1 = [a, b, c]
list2 = [1, 2, 3]
因此,它应该为列表1的每个值循环列表2。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
值。您可以选择嵌套,而不是嵌套循环;如果希望更改
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)
使用
l2
值填充
{}
列表1字符串中的
{}
,从而避免每次从头开始重建
列表2

>>> 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中的来自未来导入的
):

这取决于您还想对生成的值做什么

请注意,如果
1
5
数字在
list1
的值之间保持不变,则根本不需要使用字符串模板或元组进行复杂的转换。您只需引用循环中的内容:

b, c = 1, 5
list1 = ['ABC', 'CDE']
list2 = ['123','234','456']
for l2, l1 in product(list2, list1):
    print '{} {} {} {}'.format(l1, l2, b, c)

我仍然使用字符串格式只是为了显示将多个值组合成一个字符串的另一种形式。

您需要在循环中插入
list2
值。您可以选择嵌套,而不是嵌套循环;如果希望更改
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)
使用
l2
值填充
{}
列表1
字符串中的
{}
,从而避免每次从头开始重建
列表2

>>> 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中的来自未来导入的
):

这取决于您还想对生成的值做什么

请注意,如果
1
5
数字在
list1
的值之间保持不变,则根本不需要使用字符串模板或元组进行复杂的转换。您只需引用循环中的内容:

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
也就是说,这可以通过以下方式进行改进:


您需要将
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
也就是说,这可以通过以下方式进行改进:


为什么不使用字符串模板呢?@MartijnPieters我刚刚指出了OPs代码中的错误,以便他们理解它的错误。我本来打算发布一个改进的版本,但你已经击败了我。不管怎样,请随时继续编辑!未来的访问者可能会欣赏另一种观点。为什么不使用字符串模板呢?@MartijnPieters我刚刚指出了OPs代码中的错误,以便他们理解它的错误。我本来打算发布一个改进的版本,但你已经击败了我。不管怎样,请随时继续编辑!未来的游客可能会欣赏另一种观点。