我有一本字典,其键可以是大写或小写。我所有的价值观都是int。我想对所有键执行.lower()并汇总将映射到相同小写键的键的值。
示例输入:
{'banana':3, 'Banana': 2, 'apple': 4, 'PeAr':7}
输出:
{'banana':5, 'apple': 4, 'pear':7}
答案 0 :(得分:2)
理想情况下,您甚至想避免此问题的发生。创建原始字典时,只需先在键上调用.lower()
,然后再将其存储在字典中即可。
无论如何,您可以使用defaultdict
:
from collections import defaultdict
d = {'banana':3, 'Banana': 2, 'apple': 4, 'PeAr':7}
out = defaultdict(int)
for k, v in d.items():
out[k.lower()] += v
print(out)
# defaultdict(<class 'int'>, {'banana': 5, 'apple': 4, 'pear': 7})
没有defaultdict
的解决方案更长:
d = {'banana': 3, 'Banana': 2, 'apple': 4, 'PeAr': 7}
out = {}
for k, v in d.items():
k = k.lower()
try:
out[k] += v
except KeyError:
out[k] = v
print(out)
# {'banana': 5, 'apple': 4, 'pear': 7}
或者即使使用.setdefault
,尽管我个人并不喜欢(部分原因是您不得不两次提及密钥,并且如果未对其进行硬编码,则默认值在两次迭代之间可能会发生变化)。
d = {'banana': 3, 'Banana': 2, 'apple': 4, 'PeAr': 7}
out = {}
for k, v in d.items():
k = k.lower()
out[k] = out.setdefault(k, 0) + v
print(out)
# {'banana': 5, 'apple': 4, 'pear': 7}
答案 1 :(得分:0)
看看这个:lists comprehensions
这可能会导致您出现以下情况:
result = {k.lower(): sum([mydict[x] for x in mydict if x.lower() == k.lower()]) for k, v in mydict.items()}