【问题标题】:python list of dictionaries find duplicates based on valuepython 字典列表根据值查找重复项
【发布时间】:2013-02-12 00:21:48
【问题描述】:

我有一个字典列表:

a =[{'id': 1,'desc': 'smth'},
    {'id': 2,'desc': 'smthelse'},
    {'id': 1,'desc': 'smthelse2'},
    {'id': 1,'desc': 'smthelse3'}]

我想通过列表找到那些具有相同id 值的字典(例如id=1)并创建一个新字典:

b = [{'id':1, 'desc' : [smth, smthelse2,smthelse3]}, 
     {'id': 2, 'desc': 'smthelse'}]

【问题讨论】:

  • 字典是否总是包含两个键,iddesc,还是问题更普遍?
  • 保留列表中的顺序很重要吗?
  • @NPE - 如果 OP 为单个条目保留字符串并为多个条目保留列表,问题将“更普遍”(并且丑陋)。

标签: python list dictionary


【解决方案1】:

你可以试试:

import operator, itertools

key = operator.itemgetter('id')

b = [{'id': x, 'desc': [d['desc'] for d in y]} 
     for x, y in itertools.groupby(sorted(a, key=key), key=key)]

【讨论】:

    【解决方案2】:
    from collections import defaultdict
    
    d = defaultdict(list)
    for x in a:
        d[x['id']].append(x['desc']) # group description by id
    b = [dict(id=id, desc=desc if len(desc) > 1 else desc[0])
         for id, desc in d.items()]
    

    为了保持秩序:

    b = []
    for id in (x['id'] for x in a):
        desc = d[id]
        if desc:
           b.append(dict(id=id, desc=desc if len(desc) > 1 else desc[0]))
           del d[id]
    

    【讨论】:

      【解决方案3】:

      最好将“desc”值作为列表保存在任何地方,即使它们只包含一个元素。这样就可以了

      for d in b:
          print d['id']
          for desc in d['desc']:
              print desc
      

      这也适用于字符串,只是返回单个字符,这不是你想要的。

      现在解决方案为您提供列表的列表:

      a =[{'id': 1,'desc': 'smth'},{'id': 2,'desc': 'smthelse'},{'id': 1,'desc': 'smthelse2'},{'id': 1,'desc': 'smthelse3'}]
      
      c = {}
      for d in a:
          c.setdefault(d['id'], []).append(d['desc'])
      b = [{'id': k, 'desc': v} for k,v in c.iteritems()]
      

      b 现在是:

      [{'desc': ['smth', 'smthelse2', 'smthelse3'], 'id': 1},
       {'desc': ['smthelse'], 'id': 2}]
      

      【讨论】:

      • 如果我必须基于一个以上的键查找相等的 dicts 怎么办。我有同样的问题,但唯一 id 是基于 5 个键?
      • 我知道这已经晚了,但你可以有一个元组作为字典键。
      猜你喜欢
      • 2016-03-13
      • 2021-11-17
      • 2023-01-07
      • 2019-01-03
      • 2019-01-15
      • 2013-07-06
      • 2022-01-22
      相关资源
      最近更新 更多