如何从dict列表中删除重复项?

2024-06-26 01:50:27 发布

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

我有一个python字典列表,如下所示:

[{'category': 'software', 'name': 'irssi', 'version': '1.2.0'},
 {'category': 'software', 'name': 'irssi', 'version': '1.1.2'},
 {'category': 'software', 'name': 'hexchat', 'version': '2.14.2'}]

(正在分析某些数据txt文件)

我想做的是:

如果category和name相同,我希望保留包条目的第一个外观,并删除其余条目,因此最终输出将如下所示:

^{pr2}$

我应该如何实现这一点?我试图将字典列表转换为一个字典,然后用dict.items()对其进行迭代,但没有成功。在


Tags: 文件数据name目的txt列表字典version
3条回答

使用itertools.groupby,并取每组中的第一个:

def uniq(lst):
    for _, grp in itertools.groupby(lst, lambda d: (d['category'], d['name'])):
        yield list(grp)[0]
lst = [{'category': 'software', 'name': 'irssi', 'version': '1.2.0'},
       {'category': 'software', 'name': 'irssi', 'version': '1.1.2'},
       {'category': 'software', 'name': 'hexchat', 'version': '2.14.2'}]
print(list(uniq(lst))

使用^{}跟踪您已经看到的所有(category, name)对:

lst = [
    {'category': 'software', 'name': 'irssi', 'version': '1.2.0'},
    {'category': 'software', 'name': 'irssi', 'version': '1.1.2'},
    {'category': 'software', 'name': 'hexchat', 'version': '2.14.2'}
]

seen = set()
result = []

for dic in lst:
    key = (dic['category'], dic['name'])
    if key in seen:
        continue

    result.append(dic)
    seen.add(key)

print(result)
# output: [{'category': 'software', 'name': 'irssi', 'version': '1.2.0'},
#          {'category': 'software', 'name': 'hexchat', 'version': '2.14.2'}]

这可以概括为一个函数:

^{pr2}$
>>> list(keep_first(lst, lambda d: (d['category'], d['name'])))
[{'category': 'software', 'name': 'irssi', 'version': '1.2.0'},
 {'category': 'software', 'name': 'hexchat', 'version': '2.14.2'}]

假设您希望保留最后一个版本,那么您可以创建一个字典来保存每个类别/名称对的最新版本的软件信息。然后从字典中获取值列表:

software = [{'category': 'software', 'name': 'irssi', 'version': '1.2.0'},
            {'category': 'software', 'name': 'irssi', 'version': '1.1.2'},
            {'category': 'software', 'name': 'hexchat', 'version': '2.14.2'}]

lastVersion = dict()
for softInfo in software:
    key = (softInfo['category'],softInfo['name'])
    if key not in lastVersion or lastVersion[key]['version'] < softInfo['version']:
        lastVersion[key] = softInfo
software = list(lastVersion.values())

print(software)

# [{'category': 'software', 'name': 'irssi', 'version': '1.2.0'},
#  {'category': 'software', 'name': 'hexchat', 'version': '2.14.2'}]

相关问题 更多 >