我正在尝试从顺序非常重要的多个列表中生成元素组合。
例如:
list1_mand = ['x', 'y']
list2 = ['a', 'b', 'c']
list3 = ['1', '2', '3']
list4_mand = ['A', 'B', 'C']
list5 = ['X', 'Y', 'Z']
该代码应该能够执行以下操作:
例如: “ xa1AX”是有效输出,而“ axXA1”不是有效
例如: “ xAX”是有效的输出,而“ a1AX”则不是(跳过list1_mand中的元素)。
考虑到以上三个限制,我如何使用itertools包生成所需的输出?
答案 0 :(得分:3)
这是您想要的itertools.product
。棘手的部分是可以省略非强制性列表,但是为此,有一种解决方法 1 。
from itertools import product
list1_mand = ['x', 'y']
list2 = ['a', 'b', 'c']
list3 = ['1', '2', '3']
list4_mand = ['A', 'B', 'C']
list5 = ['X', 'Y', 'Z']
lst = [list1_mand, list2 + [''], list3 + [''], list4_mand, list5 + ['']]
# if you want to generate them one-by-one (for processing in between or whatnot)
for c in product(*lst):
new_string = ''.join(c)
# do something with it before yielding the next one
# if you don't mind generating them all at once, see note 2.
res = [''.join(c) for c in product(*lst)]
无论哪种方式,这都是第一个产生的:
# xa1AX
# xa1AY
# xa1AZ
# xa1A <-- first example of omission.
# xa1BX
# xa1BY
# xa1BZ
# xa1B
# xa1CX
# xa1CY
# xa1CZ
# xa1C
# xa2AX
# xa2AY
# xa2AZ
# xa2A
# xa2BX
# xa2BY
1 通过在非强制性列表中添加""
,将会得到包含该结果的结果,因此,例如,'xA'
也将是{{ 1}}(最终)。
2 请注意,yield
列表的长度将是变通方法修改后的初始列表长度的乘积。在这种情况下,它是384(= 2x4x4x3x4)很小,但是请记住,以防万一,您决定增大尺寸。