Python:添加字典值以形成新的元组键控字典

时间:2011-06-24 13:09:16

标签: python dictionary

如果我有一个字典如下(有一些列表):

units = ['a','b']
nums = ['1','2']
ratios = ['alpha', 'beta']

d = {'a_1_alpha':4, 'a_1_beta' :1, 'a_2_alpha' :2, 'a_2_beta': 3, 'b_1_alpha':2}

我如何从新词典中获取:

  • 形成一个密钥,包括来自列表nums&的元组(num,ratio)#items。比率
  • 该值将是早期字典(d)值的总和。

new_d = { ('1','alpha'): 6, ('1','beta'): 1, ('2','alpha'): 2, ('2','beta'): 3}

我有以下代码,但似乎不对。

new_d = {}
for num in nums:
    for ratio in ratios:
        for k,v in d.items():
            if ratio in k:
                try:
                    oldval = dict[num,ratio]
                except:
                    oldval = 0
                new_d[(num,ratio)] = oldval + v

for p,q in new_d.items():
    print p,q

请帮助评论/建议。 谢谢:)。

3 个答案:

答案 0 :(得分:6)

两个外部循环是冗余的,只是遍历d的键值对。您可以使用split()轻松提取密钥的三个组成部分。这是代码:

new_d = {}
for k, v in d.items():
   u, n, r = k.split('_')
   new_d[(n, r)] = v + new_d.get((n, r), 0)

答案 1 :(得分:2)

这可以解决您的问题:

new_d = {}
for n in nums:
    for r in ratios:
        for k, v in d.items():
            if r in k and n in k:
                try:
                    old = new_d[(n, r)]
                except:
                    old = 0
                new_d[(n, r)] = v + old

for p, q in new_d.items():
    print (p, q)

顺便说一下。在确定密钥是否可行时,您也忘记检查n in k

答案 2 :(得分:2)

或使用collections模块:

d = {'a_1_alpha':4, 'a_1_beta' :1, 'a_2_alpha' :2, 'a_2_beta': 3, 'b_1_alpha':2}

from collections import defaultdict

new_d = defaultdict(int)

for k,v in ((tuple(k.split('_')[1:]),v) for k,v in d.iteritems()):
    new_d[k] += v