【问题标题】:How to remove duplicate elements of, list of dictionaries in python如何删除python中字典列表的重复元素
【发布时间】:2019-08-20 13:39:54
【问题描述】:

我有一个校区列表:

campus = [{'id': '1', 'dlin': '1'}, {'id': '2', 'dlin': '1'},{'id': '3', 'dlin': '1'},{'id': '4', 'dlin': '2'},{'id': '5', 'dlin': '2'},{'id': '6', 'dlin': '1'}, ]

每个校区都属于具有独特 dlin 的学校。我想要一个列表,其中有一些其他列表,每个列表都有一些字典。 我运行以下代码:

schools = []
for i in campus:
    ls = []
    for j in campus:
        if i['dlin'] == j['dlin']:
            ls.append(j)
            # campus_copy.remove(j)
    schools.append(ls)
[print(item) for item in schools]

结果是:

[{'id': '1', 'dlin': '1'}, {'id': '2', 'dlin': '1'}, {'id': '3', 'dlin': '1'}, {'id': '6', 'dlin': '1'}]
[{'id': '1', 'dlin': '1'}, {'id': '2', 'dlin': '1'}, {'id': '3', 'dlin': '1'}, {'id': '6', 'dlin': '1'}]
[{'id': '1', 'dlin': '1'}, {'id': '2', 'dlin': '1'}, {'id': '3', 'dlin': '1'}, {'id': '6', 'dlin': '1'}]
[{'id': '4', 'dlin': '2'}, {'id': '5', 'dlin': '2'}]
[{'id': '4', 'dlin': '2'}, {'id': '5', 'dlin': '2'}]
[{'id': '1', 'dlin': '1'}, {'id': '2', 'dlin': '1'}, {'id': '3', 'dlin': '1'}, {'id': '6', 'dlin': '1'}]

我必须从学校中删除重复的成员或修改代码以免重复。 当我尝试从学校删除重复项时,我看到 dic 项目不可散列,所以我不能这样做。 可用的解决方案与我的问题有些相似。 Remove duplicates from list of dictionaries within list of dictionaries Remove duplicate dict in list in Python 但是,我不知道该怎么办? 有人知道如何解决这个问题吗?

我期望得到的是:

[{'id': '1', 'dlin': '1'}, {'id': '2', 'dlin': '1'}, {'id': '3', 'dlin': '1'}, {'id': '6', 'dlin': '1'}]
[{'id': '4', 'dlin': '2'}, {'id': '5', 'dlin': '2'}]

【问题讨论】:

  • 你能发布你的预期输出吗?有点难以理解你想要什么?

标签: python list dictionary duplicates hashable


【解决方案1】:

一种可能的解决方案是将dlin 作为键存储在字典中(并且字典不能有多个相等的键),而不是之后显式删除重复项:

campus = [{'id': '1', 'dlin': '1'}, {'id': '2', 'dlin': '1'},{'id': '3', 'dlin': '1'},{'id': '4', 'dlin': '2'},{'id': '5', 'dlin': '2'},{'id': '6', 'dlin': '1'}, ]

schools = {}
for c in campus:
    schools.setdefault(c['dlin'], []).append(c)

for s in schools.values():
    print(s)

打印:

[{'id': '1', 'dlin': '1'}, {'id': '2', 'dlin': '1'}, {'id': '3', 'dlin': '1'}, {'id': '6', 'dlin': '1'}]
[{'id': '4', 'dlin': '2'}, {'id': '5', 'dlin': '2'}]

【讨论】:

  • 这就是我想要的,但我不明白你做了什么。 setdefault 在这里做了什么
  • @AminBa setdefault() 方法从字典中返回键的值(如果键在字典中)。如果键不存在,它会将带有值的键插入字典 - 在这种情况下为空列表 [] docs.python.org/3/library/stdtypes.html#dict.setdefault
  • 太棒了!
【解决方案2】:

根据 Andrej 的回答,我解决了我的另一部分问题,我只想在这里分享:

我的问题:

我现在涉及与上一个相关的另一个问题:

我有这个词典列表,每个校区的信息。多个校区可能属于一所学校。我必须根据它们名字的相似性来区分和聚类它们。

campus = [
{'id': '1', 'name': 'seneca - york'}, 
{'id': '2', 'name': 'seneca college - north gate campus'},
{'id': '3', 'name': 'humber college - toronto campus'},
{'id': '4', 'name': 'humber college'},
{'id': '5', 'name': 'humber collge - waterloo campus'},
{'id': '6', 'name': 'university of waterloo toronto campus'}, 
]

这个小而简洁的代码可以达到我的预期结果:

schools = {}
for c in campus:
    schools.setdefault(c['name'][:4], []).append(c)
print(schools)

【讨论】:

    猜你喜欢
    • 2014-06-29
    • 2023-01-12
    • 2013-09-01
    • 2023-01-08
    • 1970-01-01
    • 2019-08-22
    • 2011-10-28
    • 2017-08-13
    • 1970-01-01
    相关资源
    最近更新 更多