如何在Python列表中计算字典元素的频率并删除重复的字典元素?

5
我是一名有帮助的助手,可以为您进行文本翻译。以下是您需要翻译的内容:

我有一个列表,列表中的元素是字典类型。

例如:

da_list = [
    {'Surface':'APPLE','BaseForm':'apple','PN':0.5},
    {'Surface':'BANANA','BaseForm':'banana','PN':0.4},
    {'Surface':'ORANGE','BaseForm':'orange','PN':-0.1},
    {'Surface':'APPLE','BaseForm':'apple','PN':0.5},
    {'Surface':'BANANA','BaseForm':'banana','PN':0.4} 
]

我想定义一个名为db_list的新列表。 db_list存储像这样的字典元素:
db_list = [
    {'Surface':'APPLE','BaseForm':'apple','PN':0.5,'Frequency':2},
    {'Surface':'BANANA','BaseForm':'banana','PN':0.4,'Frequency':2},
    {'Surface':'ORANGE','BaseForm':'orange','PN':-0.1,'Frequency':1} 
]

db_list会移除da_list中的重复元素,并且添加每个字典出现的频率。

怎样实现这个功能呢?

2个回答

2
您可以使用 itertools.groupby:
import itertools
da_list = [{'Surface':'APPLE','BaseForm':'apple','PN':0.5}, {'Surface':'BANANA','BaseForm':'banana','PN':0.4}, {'Surface':'ORANGE','BaseForm':'orange','PN':-0.1}, {'Surface':'APPLE','BaseForm':'apple','PN':0.5}, {'Surface':'BANANA','BaseForm':'banana','PN':0.4}]
new_result = [list(b) for _, b in itertools.groupby(sorted(da_list, key=lambda x:x['Surface']), key=lambda x:x['Surface'])]
final_result = [{**i[0], 'Frequency':len(i)} for i in new_result]

输出:

[{'Surface': 'APPLE', 'BaseForm': 'apple', 'PN': 0.5, 'Frequency': 2}, {'Surface': 'BANANA', 'BaseForm': 'banana', 'PN': 0.4, 'Frequency': 2}, {'Surface': 'ORANGE', 'BaseForm': 'orange', 'PN': -0.1, 'Frequency': 1}]

请问,这里的 **i[0] 是什么意思?有相关文档吗? - ytu
@ytu **python 3.x 中的字典解包功能。您可能熟悉 **kwargs 作为函数签名中的参数,以接受可变数量的参数分配,但是该语法也可以用于将字典“展开”或“嵌入”到彼此中。请参见 https://www.python.org/dev/peps/pep-0448/。 - Ajax1234

1
你可以将Counter列表推导式一起使用。
from collections import Counter
>>> [dict(k + (('frequency', v),)) for k,v in Counter(tuple(k.items()) for k in da_list).items()]

[{'Surface': 'APPLE', 'BaseForm': 'apple', 'PN': 0.5, 'frequency': 2},
 {'Surface': 'BANANA', 'BaseForm': 'banana', 'PN': 0.4, 'frequency': 2},
 {'Surface': 'ORANGE', 'BaseForm': 'orange', 'PN': -0.1, 'frequency': 1}]

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