【问题标题】:How to calculate subtotal of values of dictionary for key substring matches using dictionary comprehension如何使用字典理解计算键子字符串匹配的字典值小计
【发布时间】:2020-11-07 11:20:20
【问题描述】:

我想将下面的字典逻辑转换为字典理解逻辑,我该怎么做?

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

【问题讨论】:

    标签: python python-3.x dictionary dictionary-comprehension


    【解决方案1】:

    为什么要使用 dict comp?这是可行的,但它会很丑。

    我只会使用defaultdict

    from collections import defaultdict
    
    dict_b = defaultdict(int)
    
    for k, v in dict_a.items():
        dict_b[k.split('_')[0]] += v
    

    【讨论】:

      【解决方案2】:

      另一种解决方案,没有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}
      

      【讨论】:

        【解决方案3】:

        如果您确定订单,可以使用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}
        

        【讨论】:

          【解决方案4】:

          您可以创建一组唯一键,然后在找到该键时迭代字典对值求和:

          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}
          

          【讨论】:

            猜你喜欢
            • 2016-12-31
            • 1970-01-01
            • 2022-11-17
            • 2021-05-16
            • 2019-05-01
            • 2016-10-23
            • 2022-10-14
            • 1970-01-01
            • 2020-08-04
            相关资源
            最近更新 更多