在必须对元素进行排序的情况下,如何生成元素的动态组合?

时间:2019-01-25 10:03:31

标签: python itertools

我正在尝试从顺序非常重要的多个列表中生成元素组合。

例如:

list1_mand = ['x', 'y']
list2 = ['a', 'b', 'c']
list3 = ['1', '2', '3']
list4_mand = ['A', 'B', 'C']
list5 = ['X', 'Y', 'Z']

该代码应该能够执行以下操作:

  1. 以非常特定的顺序生成所有可能的组合(list1_mand中的第一个元素,list2中的下一个,依此类推...):顺序不能是list2中的第一个元素,list5中的下一个,依此类推。

例如: “ xa1AX”是有效输出,而“ axXA1”不是有效

  1. 不应重复元素。
  2. 对于特定列表(list1_mand,list4_mand),这些列表中的元素必须存在于组合中,而其他列表中的元素可以跳过。

例如: “ xAX”是有效的输出,而“ a1AX”则不是(跳过list1_mand中的元素)。

考虑到以上三个限制,我如何使用itertools包生成所需的输出?

1 个答案:

答案 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)很小,但是请记住,以防万一,您决定增大尺寸。