我有15个类似于以下3个(所有15个都有不同的长度)。 例如:
HQDict = {'HQ1':10, 'HQ2':3, 'HQ3':5}
BADict = {'BA1':15, 'BA2':4, 'BA3':3}
STDict = {'ST1':5, 'ST2':4, 'ST3':3}
我想创建15个dicts的所有可能组合,只从每个dict中选择一个元素,并将值加在一起,并将键存储在列表中。我已经能够将所有信息都记录到相应的序列中,但我对从哪里开始组合无能为力,我已经看过itertools.combinations但是我不知道如何使它只从每个dict中选择1个元素。如果您需要更多信息,请询问,我将很乐意进行编辑。
EDIT1: 我还需要补充说,这些值是加法的,因此BA2的值将是BA1 + BA2的值,并且该组合可以是1的列表。
list=[HQ1,BA2,ST1]
value=34
next permutation
list=[HQ2]
value=13
EDIT2:
不是尝试创建dicts的组合,而是最终目标是给函数一个总数,它将返回所有可能的建筑物组合(每个dict代表一个建筑物,并且dict中的每个项目都是一个级别)达到那个总数。例如:
combinations(34) would return
[HQ1,BA2,ST1]
and combinations(13 would return
[HQ2]
pastebin to file包含所有建筑物和代码我用来创建dicts:link to pastebin
答案 0 :(得分:2)
我见过itertools.combinations,但我不知道如何让它只从每个字典中选择1个元素。
请改用itertools.product(..)
。它需要一个不同的参数列表,每个参数对应于一次迭代中要选择的选项列表:
>>> map(dict, product(HQDict.items(), STDict.items(), BADict.items()))
[{'HQ1': 10, 'BA2': 4, 'ST1': 5}, {'HQ1': 10, 'ST1': 5, 'BA3': 3}, ...... ]
如果你有15个这样的词组,我建议把所有这些都放在一个列表中,然后调用下面的产品:
>>> map(dict, product(*list_of_dicts))
编辑:在python3中,您将获得一个地图对象,您将不得不迭代它以获取实际值。你可以将它转换为一个列表,但是会破坏map返回你可以迭代的东西的目的。您可以转换为以下列表:
>>> [dict(x) for x in product(HQDict.items(), STDict.items(), BADict.items())]
[{'HQ1': 10, 'BA2': 4, 'ST1': 5}, {'HQ1': 10, 'ST1': 5, 'BA1': 15}, ..]