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

7

我有一个字典列表,希望获得那些在某个键中拥有相同值的字典:

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]

我已经理解了这段代码的问题,但是还不能构造出正确的语句。

4个回答

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]

4
与原帖中的O(N^2)方法相比,这提供了一个O(N)的解决方案。非常好! - Tomerikoo

4
您可以使用以下列表推导式:
>>> [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'}]

5
时间复杂度为O(N^2)没有必要。 - Chris_Rands

0

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

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] 

0
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')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接