将键与.lower()合并并求和

时间:2019-04-30 12:04:24

标签: python-3.x

我有一本字典,其键可以是大写或小写。我所有的价值观都是int。我想对所有键执行.lower()并汇总将映射到相同小写键的键的值。

示例输入:

{'banana':3, 'Banana': 2, 'apple': 4, 'PeAr':7}

输出:

{'banana':5, 'apple': 4, 'pear':7}

2 个答案:

答案 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()}