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

2024-05-15 01:28:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我想做一些列表的排列。如果我用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]))

我做错什么了? 谢谢


Tags: in列表forproductrepeatprintitertoolsta1
1条回答
网友
1楼 · 发布于 2024-05-15 01:28:05

考虑到前两种情况下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))

相关问题 更多 >

    热门问题