打印每个字典键组合的列表,以及右侧

时间:2016-08-26 22:39:31

标签: python dictionary product itertools cartesian-product

我有几个字典,我想要打印一个表,其中每一行都是所有字典中键的唯一组合。对于每一行,我还想打印特定组合中键的值的总和。

所以,如果我有这些词典:

dict1 = {"Main": 8, "Optional": 6, "Obscure": 4}
dict2 = {"Global": 8, "Regional": 4, "Local": 2}
...

输出看起来像这样(按从最高到最低的顺序排序):

Main, Global, 16
Optional, Global, 14
Main, Regional, 12
Obscure, Global, 12
Main, Local, 10
Optional, Regional, 10
Optional, Local, 8
Obscure, Regional, 8
Obscure, Local, 6

从我所读过的内容来看,itertools.product将是我所寻找的,但现有的问题都不是我的用例,而且我甚至都在努力开始。< / p>

任何帮助都将不胜感激。

由于

4 个答案:

答案 0 :(得分:1)

我认为这将是:

import itertools

dict1 = {"Main": 8, "Optional": 6, "Obscure": 4}
dict2 = {"Global": 8, "Regional": 4, "Local": 2}

merged = {'{}, {}'.format(prod[0], prod[1]): dict1[prod[0]] + dict2[prod[1]] 
          for prod in itertools.product(dict1, dict2)}

for k, v in merged.items():
    print('{}: {}'.format(k, v))

输出:

Optional, Regional: 10
Main, Regional: 12
Optional, Local: 8
Main, Global: 16
Optional, Global: 14
Main, Local: 10
Obscure, Regional: 8
Obscure, Global: 12
Obscure, Local: 6

答案 1 :(得分:1)

使用来自product的{​​{1}}字典项目(),您可以同时获取密钥和值,并且通过键值对的组合,您可以构建最终结果很简单:

itertools

答案 2 :(得分:1)

你读得对。只需添加put(user_stack_type)

即可
sorted()

答案 3 :(得分:1)

此方法用于支持可变数量的词典。您将字典传递给get_product_sums()方法,然后根据字典元组创建笛卡尔积。

然后,我们通过我们的subitem查看现在只是一维字典来迭代我们的新flattened来计算总和。然后我们按总和排序,并返回最终result的元组排序列表。

from itertools import product

def get_product_sums(* args):
    result = []
    flattened = {k:v for d in args for k, v in d.items()}
    for subitem in product(* args, repeat=1):
        data = subitem + (sum(flattened[key] for key in subitem),)  
        result.append(data)
    return sorted(result, key=lambda x: x[-1], reverse=True)

示例输出:

>>> dict1 = {"Global": 8, "Regional": 4, "Local": 2} 
>>> dict2 = {"Main": 8, "Optional": 6, "Obscure": 4}
>>> for item in get_product_sums(dict1, dict2):
...     print ', '.join(str(element) for element in item)
Global, Main, 16
Global, Optional, 14
Global, Obscure, 12
Regional, Main, 12
Local, Main, 10
Regional, Optional, 10
Local, Optional, 8
Regional, Obscure, 8
Local, Obscure, 6