如果我有一个字典如下(有一些列表):
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}
我如何从新词典中获取:
即
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
请帮助评论/建议。 谢谢:)。
答案 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