【问题标题】:detect same key value in list of dictionaries and merge them在字典列表中检测相同的键值并将它们合并
【发布时间】:2017-12-02 09:31:47
【问题描述】:

我有一个列表,在该列表中我有具有相同键值的字典。代码应检测到重复的item_no 并应合并字典(将价格和计数加在一起)。 Python 版本是 3.5。

[{'count': 1, 'item_no': 'E-Y12-A6-301', 'price': 748}, 
 {'count': 3, 'item_no': 'E-Y12-A6-301', 'price': 2244}, 
 {'count': 1, 'item_no': 'E-Y13-A3-301', 'price': 748}]

最终结果应该是这样的:

[{'count': 4, 'item_no': 'E-Y12-A6-301', 'price': 2992}, 
 {'count': 1, 'item_no': 'E-Y13-A3-301', 'price': 748}]

【问题讨论】:

  • 到目前为止,您尝试过什么?您是否至少尝试过遍历字典以创建您描述的结果?发布一些代码来说明您自己解决此问题时遇到的问题。
  • 我添加了一个或许更有效的解决方案

标签: python list python-3.x dictionary python-3.5


【解决方案1】:

做:

from pprint import pprint

l = [{'count': 1, 'item_no': 'E-Y12-A6-301', 'price': 748},
     {'count': 3, 'item_no': 'E-Y12-A6-301', 'price': 2244},
     {'count': 1, 'item_no': 'E-Y13-A3-301', 'price': 748}]


items = dict()

for item in l:
    _id = item['item_no']
    if _id not in items:
        items[_id] = item
    else:
        items[_id]['count'] += item['count']
        items[_id]['price'] += item['price']

nl = list(items.values())

pprint(nl)

输出:

[{'count': 1, 'item_no': 'E-Y13-A3-301', 'price': 748},
 {'count': 4, 'item_no': 'E-Y12-A6-301', 'price': 2992}]

【讨论】:

  • 顺便说一句,而不是_id not in items.keys(),写_id not in items就足够了。
【解决方案2】:
l = [{'count': 1, 'item_no': 'E-Y12-A6-301', 'price': 748}, 
     {'count': 3, 'item_no': 'E-Y12-A6-301', 'price': 2244}, 
     {'count': 1, 'item_no': 'E-Y13-A3-301', 'price': 748}]

new_l = [{'count': sum(d['count'] for d in l if d['item_no']==item_no),
          'price': sum(d['price'] for d in l if d['item_no']==item_no),
          'item_no': item_no} 
         for item_no in set(i['item_no'] for i in l)]

【讨论】:

  • 很高兴你喜欢它,它不是最有效的方法,但它更 pythonic 恕我直言
【解决方案3】:

此解决方案仅对l 进行一次迭代,它还按计数对l 进行排序,尽管您可以按您想要的任何值进行排序,它还会重新分配l,而不是创建一个新列表:

def merge_dicts(list_of_dicts):
    items = {}
    for dct in list_of_dicts:
        item_no = dct['item_no']
        if item_no in items:
            items[item_no]['count'] += dct['count']
            items[item_no]['price'] += dct['price']
        else:
            items[item_no] = dct
    return sorted(items.values(),key=lambda k: k['count'])

l = [{'count': 1, 'item_no': 'E-Y12-A6-301', 'price': 748},
     {'count': 3, 'item_no': 'E-Y12-A6-301', 'price': 2244},
     {'count': 1, 'item_no': 'E-Y13-A3-301', 'price': 748}]  
l = merge_dicts(l)

如果您希望它们按降序排序,请将返回行替换为以下行:

return sorted(items.values(),key=lambda k: k['count'],reverse=True)

如果你想整齐地打印出字典:

for dct in l:
    print ("Item No: "+dct['item_no'])
    print ("  Price: "+str(dct['price']))
    print ("  Count: "+str(dct['count']))
    print ("-"*50)

打印:

Item No: E-Y12-A6-301
  Price: 2992
  Count: 4
--------------------------------------------------
Item No: E-Y13-A3-301
  Price: 748
  Count: 1
--------------------------------------------------

【讨论】:

    猜你喜欢
    • 2015-08-25
    • 1970-01-01
    • 1970-01-01
    • 2019-11-19
    • 1970-01-01
    • 2020-10-14
    • 2022-12-03
    • 2022-12-18
    • 2021-07-29
    相关资源
    最近更新 更多