按特定键统计字典中的重复项

2024-07-08 10:26:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个字典列表,我需要按特定键计算重复的字典。 例如:

[
   {'name': 'John', 'age': 10, 'country': 'USA', 'height': 185}, 
   {'name': 'John', 'age': 10, 'country': 'Canada', 'height': 185}, 
   {'name': 'Mark', 'age': 10, 'country': 'USA', 'height': 180},
   {'name': 'Mark', 'age': 10, 'country': 'Canada', 'height': 180},
   {'name': 'Doe', 'age': 15, 'country': 'Canada', 'height': 185}
]

如果将指定“age”和“country”,则应返回

[  
   {
      'age': 10,
      'country': 'USA',
      'count': 2 
   },
   {
      'age': 10,
      'country': 'Canada',
      'count': 2 
   },
   {
      'age': 15,
      'country': 'Canada',
      'count': 1
   }
]

或者如果我将指定“名称””和“高度””:

[  
   {
      'name': 'John',
      'height': 185,
      'count': 2 
   },
   {
      'name': 'Mark',
      'height': 180,
      'count': 2 
   },
   {
      'name': 'Doe',
      'heigth': 185,
      'count': 1
   }
]

也许有办法通过计数器实现这一点


Tags: name名称列表age字典高度countjohn
1条回答
网友
1楼 · 发布于 2024-07-08 10:26:34

您可以将^{}^{}列表一起使用:

>>> data = [
   {'name': 'John', 'age': 10, 'country': 'USA', 'height': 185}, 
   {'name': 'John', 'age': 10, 'country': 'Canada', 'height': 185}, 
   {'name': 'Mark', 'age': 10, 'country': 'USA', 'height': 180},
   {'name': 'Mark', 'age': 10, 'country': 'Canada', 'height': 180},
   {'name': 'Doe', 'age': 15, 'country': 'Canada', 'height': 185}
]
>>> from itertools import groupby
>>> key = 'age', 'country'
>>> list_sorter = lambda x: tuple(x[k] for k in key)
>>> grouper = lambda x: tuple(x[k] for k in key)
>>> result = [
        {**dict(zip(key, k)), 'count': len([*g])} 
         for k, g in 
         groupby(sorted(data, key=list_sorter), grouper)
    ]
>>> result

[{'age': 10, 'country': 'Canada', 'count': 2},
 {'age': 10, 'country': 'USA', 'count': 2},
 {'age': 15, 'country': 'Canada', 'count': 1}]

>>> key = 'name', 'height'
>>> result = [
        {**dict(zip(key, k)), 'count': len([*g])} 
         for k, g in 
         groupby(sorted(data, key=list_sorter), grouper)
    ]

>>> result

[{'name': 'Doe', 'height': 185, 'count': 1},
 {'name': 'John', 'height': 185, 'count': 2},
 {'name': 'Mark', 'height': 180, 'count': 2}]

如果您使用pandas,那么您可以使用^{}^{}^{}^{},最后使用^{}orient='records'

>>> import pandas as pd
>>> df = pd.DataFrame(data)
>>> df.groupby(list(key)).size().to_frame('count').reset_index().to_dict('records')

[{'name': 'Doe', 'height': 185, 'count': 1},
 {'name': 'John', 'height': 185, 'count': 2},
 {'name': 'Mark', 'height': 180, 'count': 2}]

相关问题 更多 >

    热门问题