itertools.product没有为列表提供正确的排列

时间:2018-01-26 15:42:57

标签: python python-3.x

我想对某些列表进行排列。如果我使用itertools.product函数执行笛卡尔积,那么输出对我来说真的很奇怪

如果我对下面两个包含字符串的列表进行排列:

list1= ('In1', 'In2')
list2= ('Ta1', 'Ta2')
list3= []
list3Append= []
for list3 in itertools.product(list1, list2, repeat=1):
    list3Append.append(list3)
print('list3Append:\n', list3Append)

输出正常

list3Append:[('In1', 'Ta1'), ('In1', 'Ta2'), ('In2', 'Ta1'), ('In2', 'Ta2')]

还有两个包含数字的列表:

list4= ([[1,2,3], [4,5,6]])
list5= ([[7, 8, 9], [10,11,12]])
list6= []
list6Append= []
for list6 in itertools.product(list4, list5, repeat=1):
    list6Append.append(list6)
print('list6Append:\n', list6Append)

输出也没问题

list6Append:[([1, 2, 3], [7, 8, 9]), ([1, 2, 3], [10, 11, 12]), ([4, 5, 6], [7, 8, 9]), ([4, 5, 6], [10, 11, 12])]

但如果我想为list3Appendlist6Append

进行排列
list7= []
for list7 in itertools.product(list3Append, list6Append, repeat=1):
    print('list7:\n', list7)

然后我得到:

list7: (('In1', 'Ta1'), ([1, 2, 3], [7, 8, 9]))
list7: (('In1', 'Ta1'), ([1, 2, 3], [10, 11, 12]))
list7: (('In1', 'Ta1'), ([4, 5, 6], [7, 8, 9]))
list7: (('In1', 'Ta1'), ([4, 5, 6], [10, 11, 12]))
list7: (('In1', 'Ta2'), ([1, 2, 3], [7, 8, 9]))
list7: (('In1', 'Ta2'), ([1, 2, 3], [10, 11, 12]))
list7: (('In1', 'Ta2'), ([4, 5, 6], [7, 8, 9]))
list7: (('In1', 'Ta2'), ([4, 5, 6], [10, 11, 12]))
list7: (('In2', 'Ta1'), ([1, 2, 3], [7, 8, 9]))
list7: (('In2', 'Ta1'), ([1, 2, 3], [10, 11, 12]))
list7: (('In2', 'Ta1'), ([4, 5, 6], [7, 8, 9]))
list7: (('In2', 'Ta1'), ([4, 5, 6], [10, 11, 12]))
list7: (('In2', 'Ta2'), ([1, 2, 3], [7, 8, 9]))
list7: (('In2', 'Ta2'), ([1, 2, 3], [10, 11, 12]))
list7: (('In2', 'Ta2'), ([4, 5, 6], [7, 8, 9]))
list7: (('In2', 'Ta2'), ([4, 5, 6], [10, 11, 12]))

正确的输出应该是:

list7: (('In1', 'Ta1'), ([1, 2, 3], [7, 8, 9]))
list7: (('In1', 'Ta2'), ([1, 2, 3], [10, 11, 12]))
list7: (('In2', 'Ta1'), ([4, 5, 6], [7, 8, 9]))
list7: (('In2', 'Ta2'), ([4, 5, 6], [10, 11, 12]))

我在这里做错了什么? 谢谢

1 个答案:

答案 0 :(得分:2)

考虑到前两种情况中product的行为,你不应该对它在第三种情况下的行为感到惊讶。您实际上想zip列出3和6:

>>> list7 = list(zip(list3Append, list6Append))
[(('In1', 'Ta1'), ([1, 2, 3], [7, 8, 9])),
 (('In1', 'Ta2'), ([1, 2, 3], [10, 11, 12])),
 (('In2', 'Ta1'), ([4, 5, 6], [7, 8, 9])),
 (('In2', 'Ta2'), ([4, 5, 6], [10, 11, 12]))]

此外,不需要事先声明循环变量:

list1, list2  = ('In1', 'In2'), ('Ta1', 'Ta2')

list3Append = []
for list3 in itertools.product(list1, list2, repeat=1):
    list3Append.append(list3)
# Or simply:
list3Append = list(itertools.product(list1, list2))