在忽略大小写的字典中组合相同的键

Combine same keys in dictionary ignoring case

我看了又看,但找不到问题的答案。我如何结合忽略大小写的字典键。 例如说我有这样的字典。

dict = {'a':1,'A',2}

忽略大小写,这两个键是相同的字母表。因此,我希望将它们结合起来得到一个看起来像这样的字典

dict = {'a':3}

输出键的大小写无关紧要。


目前我的代码是这样的。

s = "YazaAay"
freq = {i : s.count(i) for i in set(s)}

这将 return 我

{'A': 1, 'z': 1, 'Y': 1, 'a': 3, 'y': 1}

我想要的输出是这样的

{'a':4,'z':1,'y':2}

#大小写和顺序都不重要。

大小写折叠的简单解决方案通常是在字符串上调用 lower()(或 upper())。

我还建议使用 collections.Counter 而不是构建自己的逻辑来计算字母;它效率更高(因为它只循环遍历字符串一次,而您使用 set()count() 的解决方案每个唯一字母循环遍历一次,并在开始时循环一次以构建集合)并且它使您的代码更简单。

>>> s = "YazaAay"
>>> import collections
>>> collections.Counter(s.lower())
Counter({'a': 4, 'y': 2, 'z': 1})

如果您从字典而不是字符串开始,一种选择是使用 join() 将字典转回字符串,然后使用 .lower() 应用完全相同的解决方案, Counter:

>>> d = {'A': 1, 'z': 1, 'Y': 1, 'a': 3, 'y': 1}
>>> collections.Counter(''.join(k * v for k, v in d.items()).lower())
Counter({'a': 4, 'y': 2, 'z': 1})

这里是不使用导入的解决方案。

s = "YazaAay".lower()
freq = {i: s.count(i) for i in sorted(s)}

输出:

{'a': 4, 'y': 2, 'z': 1}

在您的示例中,预先降低琴弦可以避免您的问题。

s = "YazaAay"
freq = {i : s.count(i) for i in set(s.lower())}

在更一般的情况下,如果您已经有一个混合大小写的字典,您可以使用默认字典重建:

from collections import defaultdict

d = {'A': 1, 'z': 1, 'Y': 1, 'a': 3, 'y': 1}

new_dict = defaultdict(int)
for key, val in d.items():
    new_dict[key.lower()] += val

哪个会给你

defaultdict(int, {'a': 4, 'z': 1, 'y': 2})

这是一个简单的解决方案。

# Original dictionary
d = {'A': 1, 'z': 1, 'Y': 1, 'a': 3, 'y': 1}
# Split the dictionary into 2 parts
lower_case_keys = dict((key, value) for key, value in d.items() if key.islower())
Output: {'z': 1, 'a': 3, 'y': 1}

upper_case_keys = dict((key, value) for key, value in d.items() if key.isupper())
Output: {'A': 1, 'Y': 1}
# Convert lower_case_keys to upper case for uniformity
lower_case_keys_to_upper_case = dict((key.upper(), value) for key, value in d.items())
output: {'A': 3, 'Z': 1, 'Y': 1}
from collections import Counter
final_dict = dict(Counter(lower_case_keys_to_upper_case) + Counter(upper_case_keys))
Output: {'A': 4, 'Z': 1, 'Y': 2}

所有这些都可以组合成一个函数。

from collections import Counter
def get_case_insensitive_sum(d):
    lower_case_keys = dict((key, value) for key, value in d.items() if key.islower())
    upper_case_keys = dict((key, value) for key, value in d.items() if key.isupper())
    lower_case_keys_to_upper_case = dict((key.upper(), value) for key, value in d.items())
    final_dict = dict(Counter(lower_case_keys_to_upper_case) + Counter(upper_case_keys))
    print(final_dict)
d = {'A': 1, 'z': 1, 'Y': 1, 'a': 3, 'y': 1}
get_case_insensitive_sum(d)
Output: {'A': 4, 'Z': 1, 'Y': 2}