在字典列表中按键保留重复项

cuc*_*uru 6 python dictionary list-comprehension list python-3.x

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

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'
  }
]
Run Code Online (Sandbox Code Playgroud)

我想保留那些具有相同“名称”的项目,因此,我想获得以下内容:

duplicates: [{
    'id': 3,
    'name': 'John'
  },{
    'id': 5,
    'name': 'Peter'
  },{
    'id': 2,
    'name': 'Peter'
  }, {
    'id': 7,
    'name': 'John'
  }
]
Run Code Online (Sandbox Code Playgroud)

我正在尝试(未成功):

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

我清楚这段代码的问题,但不能做正确的句子

Aus*_*tin 10

另一种简洁的方式使用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]
Run Code Online (Sandbox Code Playgroud)

  • 与OP中的“O(N^2)”方法相比,这提供了“O(N)”解决方案。很不错! (4认同)