如何在元素排序是必需的情况下生成元素的动态组合?

2024-09-30 16:26:43 发布

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

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

例如:

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

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

  1. 以非常特定的顺序生成所有可能的组合(列表1的第一个元素,列表2的下一个元素等等……):顺序不能是列表2的第一个元素,列表5的下一个元素等等

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

  1. 元素不应重复
  2. 对于特定列表(list1\u-mand、list4\u-mand),这些列表中的元素必须出现在组合中,而其他列表中的元素可以跳过

例如: “xAX”是有效的输出,而“a1AX”不是(跳过list1\u mand中的元素)

考虑到上述三个约束,如何使用itertools包生成所需的输出


Tags: 代码元素列表顺序itertoolslist2list1list3
1条回答
网友
1楼 · 发布于 2024-09-30 16:26:43

这是你想要的。棘手的部分是能够省略非强制列表,但为此,有一个解决方法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'也将yield化(最终)

2注意res列表的长度将是变通修改后初始列表长度的乘积。在这种情况下,它是384(=2x4x3x4),这是小的,但请记住,万一你决定去大

相关问题 更多 >