【发布时间】:2019-01-03 08:44:06
【问题描述】:
我有一本包含项目和每个项目的代表次数的字典,例如:
{A: 3, B: 1}
我正在寻找一种方法来获得所有可能的不同组合,
顺序无关紧要:[AB] 与 [BA] 相同。
想要的输出是:
[A, AA, AAA, B, AB, AAB, AAAB]
【问题讨论】:
-
到目前为止你尝试了什么?
标签: python list math combinations
我有一本包含项目和每个项目的代表次数的字典,例如:
{A: 3, B: 1}
我正在寻找一种方法来获得所有可能的不同组合,
顺序无关紧要:[AB] 与 [BA] 相同。
想要的输出是:
[A, AA, AAA, B, AB, AAB, AAAB]
【问题讨论】:
标签: python list math combinations
这是一种使用列表推导和itertools.product的方法:
from itertools import product, chain
d = {'A': 3, 'B': 1}
l = [[k*i for i in range(1,v+1)] for k, v in d.items()]
[''.join(element) for element in product(*l)] + list(chain.from_iterable(l))
输出:
['AB', 'AAB', 'AAAB', 'A', 'AA', 'AAA', 'B']
详情:
第一个列表解析的结果是一个嵌套列表,其中每个子列表都包含字典中包含的每个keys,从1 重复到其对应的value:
[['A', 'AA', 'AAA'], ['B']]
第二个,使用itertools.product进行笛卡尔积,每个积都是joined成一个字符串。最后使用chain.from_iterable添加了一个扁平化版本的l:
print(list(chain.from_iterable(l)))
['A', 'AA', 'AAA', 'B']
[''.join(element) for element in product(*l)]
['AB', 'AAB', 'AAAB']
【讨论】: