在忽略大小写的字典中组合相同的键
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}
我看了又看,但找不到问题的答案。我如何结合忽略大小写的字典键。 例如说我有这样的字典。
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}