如何使用字典理解计算键子字符串匹配的字典值小计
How to calculate subtotal of values of dictionary for key substring matches using dictionary comprehension
我想将下面的字典逻辑转换为字典理解逻辑,我该怎么做?
# Example: You have this dictA as input
dictA = {'chiken_biryani': 350, 'chiken_chilli': 300, 'motton_fry': 350, 'motton_biryani': 400, 'fish_prowns_fry': 250, 'fish_dry':300}
# Q: Print the total of each category, chiken, motton and fish items sub total values, using dictionary comprehension?
# Expected Output: {'chicken': 650, 'motton': 750, 'fish': 550}
dictB = dict()
for (k,v) in dictA.items():
k = k.split('_')[0]
if dictB.get(k) is None:
dictB[k] = v
else:
dictB[k] = dictB.get(k)+v
print(dictB)
输出:
{'chiken': 650, 'motton': 750, 'fish': 550}
如果您确定顺序,可以使用groupby
from itertools
:
{k: sum(x[1] for x in g) for k, g in groupby(dictA.items(), lambda x: x[0].split('_')[0])}
示例:
from itertools import groupby
# Example: You have this dictA as input
dictA = {'chiken_biryani': 350, 'chiken_chilli': 300, 'motton_fry': 350, 'motton_biryani': 400, 'fish_prowns_fry': 250, 'fish_dry':300}
dictB = {k: sum(x[1] for x in g) for k, g in groupby(dictA.items(), lambda x: x[0].split('_')[0])}
print(dictB)
# {'chiken': 650, 'motton': 750, 'fish': 550}
另一个解决方案,没有itertools
:
dictA = {'chiken_biryani': 350, 'chiken_chilli': 300, 'motton_fry': 350, 'motton_biryani': 400, 'fish_prowns_fry': 250, 'fish_dry':300}
out = {k: sum(vv for kk, vv in dictA.items() if kk.startswith(k)) for k in set(k.split('_')[0] for k in dictA)}
print(out)
打印:
{'chiken': 650, 'motton': 750, 'fish': 550}
您可以制作一组唯一键,然后迭代字典,在找到该键时对值求和:
dictA = {'chiken_biryani': 350, 'chiken_chilli': 300, 'motton_fry': 350, 'motton_biryani': 400, 'fish_prowns_fry': 250, 'fish_dry':300}
key_list = set([item.split('_')[0] for item in dictA.keys()])
dictB = {unique_key: sum(el for key, el in dictA.items() if key.split('_')[0]==unique_key) for unique_key in key_list}
结果:
{'chiken': 650, 'motton': 750, 'fish': 550}
为什么要使用 dict comp?这是可行的,但它会很难看。
我会用 defaultdict
from collections import defaultdict
dict_b = defaultdict(int)
for k, v in dict_a.items():
dict_b[k.split('_')[0]] += v
我想将下面的字典逻辑转换为字典理解逻辑,我该怎么做?
# Example: You have this dictA as input
dictA = {'chiken_biryani': 350, 'chiken_chilli': 300, 'motton_fry': 350, 'motton_biryani': 400, 'fish_prowns_fry': 250, 'fish_dry':300}
# Q: Print the total of each category, chiken, motton and fish items sub total values, using dictionary comprehension?
# Expected Output: {'chicken': 650, 'motton': 750, 'fish': 550}
dictB = dict()
for (k,v) in dictA.items():
k = k.split('_')[0]
if dictB.get(k) is None:
dictB[k] = v
else:
dictB[k] = dictB.get(k)+v
print(dictB)
输出:
{'chiken': 650, 'motton': 750, 'fish': 550}
如果您确定顺序,可以使用groupby
from itertools
:
{k: sum(x[1] for x in g) for k, g in groupby(dictA.items(), lambda x: x[0].split('_')[0])}
示例:
from itertools import groupby
# Example: You have this dictA as input
dictA = {'chiken_biryani': 350, 'chiken_chilli': 300, 'motton_fry': 350, 'motton_biryani': 400, 'fish_prowns_fry': 250, 'fish_dry':300}
dictB = {k: sum(x[1] for x in g) for k, g in groupby(dictA.items(), lambda x: x[0].split('_')[0])}
print(dictB)
# {'chiken': 650, 'motton': 750, 'fish': 550}
另一个解决方案,没有itertools
:
dictA = {'chiken_biryani': 350, 'chiken_chilli': 300, 'motton_fry': 350, 'motton_biryani': 400, 'fish_prowns_fry': 250, 'fish_dry':300}
out = {k: sum(vv for kk, vv in dictA.items() if kk.startswith(k)) for k in set(k.split('_')[0] for k in dictA)}
print(out)
打印:
{'chiken': 650, 'motton': 750, 'fish': 550}
您可以制作一组唯一键,然后迭代字典,在找到该键时对值求和:
dictA = {'chiken_biryani': 350, 'chiken_chilli': 300, 'motton_fry': 350, 'motton_biryani': 400, 'fish_prowns_fry': 250, 'fish_dry':300}
key_list = set([item.split('_')[0] for item in dictA.keys()])
dictB = {unique_key: sum(el for key, el in dictA.items() if key.split('_')[0]==unique_key) for unique_key in key_list}
结果:
{'chiken': 650, 'motton': 750, 'fish': 550}
为什么要使用 dict comp?这是可行的,但它会很难看。
我会用 defaultdict
from collections import defaultdict
dict_b = defaultdict(int)
for k, v in dict_a.items():
dict_b[k.split('_')[0]] += v