在忽略大小写的情况下组合相同的键

2024-09-28 03:25:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我看了又看,但找不到我问题的答案。我如何组合字典键,忽略它们的大小写。 比如说我有一本这样的字典

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

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

dict = {'a':3}

输出键的情况无关紧要


目前我的代码是这样的

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

这将给我带来回报

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

我想要的输出是这样的

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

#案例和订单都无关紧要


Tags: 答案代码in订单for字典count情况
3条回答

在您的示例中,预先降低字符串可以避免您的问题

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

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

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})

大小写折叠的简单解决方案通常是只调用字符串上的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}

相关问题 更多 >

    热门问题