【问题标题】:keep duplicates by key in a list of dictionaries在字典列表中按键保留重复项
【发布时间】:2020-05-06 10:39:30
【问题描述】:

我有一个字典列表,我想获取那些在键中具有相同值的字典:

my_list_of_dicts = [{
    'id': 3,
    'name': 'John'
  },{
    'id': 5,
    'name': 'Peter'
  },{
    'id': 2,
    'name': 'Peter'
  },{
    'id': 6,
    'name': 'Mariah'
  },{
    'id': 7,
    'name': 'John'
  },{
    'id': 1,
    'name': 'Louis'
  }
]

我想保留那些具有相同“名称”的项目,所以,我想获得类似的东西:

duplicates: [{
    'id': 3,
    'name': 'John'
  },{
    'id': 5,
    'name': 'Peter'
  },{
    'id': 2,
    'name': 'Peter'
  }, {
    'id': 7,
    'name': 'John'
  }
]

我正在尝试(不成功):

duplicates = [item for item in my_list_of_dicts if len(my_list_of_dicts.get('name', None)) > 1]

我已经明确了我对这段代码的问题,但不能做正确的句子

【问题讨论】:

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


    【解决方案1】:

    另一种使用collections.Counter的简洁方式:

    from collections import Counter
    
    my_list_of_dicts = [{
        'id': 3,
        'name': 'John'
      },{
        'id': 5,
        'name': 'Peter'
      },{
        'id': 2,
        'name': 'Peter'
      },{
        'id': 6,
        'name': 'Mariah'
      },{
        'id': 7,
        'name': 'John'
      },{
        'id': 1,
        'name': 'Louis'
      }
    ]
    
    c = Counter(x['name'] for x in my_list_of_dicts)
    
    duplicates = [x for x in my_list_of_dicts if c[x['name']] > 1]
    

    【讨论】:

    • 与 OP 中的 O(N^2) 方法相比,这提供了 O(N) 解决方案。非常好!
    【解决方案2】:

    您可以使用以下列表推导:

    >>> [d for d in my_list_of_dicts if len([e for e in my_list_of_dicts if e['name'] == d['name']]) > 1]
    [{'id': 3, 'name': 'John'},
     {'id': 5, 'name': 'Peter'},
     {'id': 2, 'name': 'Peter'},
     {'id': 7, 'name': 'John'}]
    

    【讨论】:

    • O(N^2) 时间复杂度不必要
    【解决方案3】:
    my_list_of_dicts = [{
        'id': 3,
        'name': 'John'
      },{
        'id': 5,
        'name': 'Peter'
      },{
        'id': 2,
        'name': 'Peter'
      },{
        'id': 6,
        'name': 'Mariah'
      },{
        'id': 7,
        'name': 'John'
      },{
        'id': 1,
        'name': 'Louis'
      }
    ]
    
    df = pd.DataFrame(my_list_of_dicts)
    df[df.name.isin(df[df.name.duplicated()]['name'])].to_json(orient='records')
    

    【讨论】:

      【解决方案4】:

      尝试类似于@cucuru 希望有帮助。 在 cmets 中解释了我所做的不同之处。

      my_list_of_dicts = [{
          'id': 3,
          'name': 'John'
        },{
          'id': 5,
          'name': 'Peter'
        },{
          'id': 2,
          'name': 'Peter'
        },{
          'id': 6,
          'name': 'Mariah'
        },{
          'id': 7,
          'name': 'John'
        },{
          'id': 1,
          'name': 'Louis'
        }
      ]
      
      
      # Create a list of names
      names = [person.get('name') for person in my_list_of_dicts]
      
      # Add item to list if the name occurs more than once in names
      duplicates = [item for item in my_list_of_dicts if names.count(item.get('name')) > 1]
      
      print(duplicates)
      

      生产

      [{'id': 3, 'name': 'John'}, {'id': 5, 'name': 'Peter'}, {'id': 2, 'name': 'Peter'}, {'id': 7, 'name': 'John'}]
      
      [Program finished] 
      

      【讨论】:

        猜你喜欢
        • 2017-10-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多