首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从字典列表中删除重复项?

如何从字典列表中删除重复项?
EN

Stack Overflow用户
提问于 2019-03-24 02:51:15
回答 3查看 4.6K关注 0票数 4

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

代码语言:javascript
复制
[{'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文件)

我想做的是:

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

代码语言:javascript
复制
[{'category': 'software', 'name': 'irssi', 'version': '1.2.0'},
{'category': 'software', 'name': 'hexchat', 'version': '2.14.2'}]

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-03-24 02:56:11

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

代码语言:javascript
复制
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))
票数 2
EN

Stack Overflow用户

发布于 2019-03-24 02:55:13

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

代码语言:javascript
复制
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'}]

这可以概括为一个函数:

代码语言:javascript
复制
def keep_first(iterable, key=None):
    if key is None:
        key = lambda x: x

    seen = set()
    for elem in iterable:
        k = key(elem)
        if k in seen:
            continue

        yield elem
        seen.add(k)
代码语言:javascript
复制
>>> 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'}]
票数 7
EN

Stack Overflow用户

发布于 2019-03-24 03:23:16

假设您想要保留最新版本,您可以创建一个字典,其中包含每个类别/名称对的最新版本的软件信息。然后从该字典中获取值列表:

代码语言:javascript
复制
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'}]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55317251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档