如何在Python中从列表中删除重复的词典?

2024-04-28 05:40:39 发布

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

我有一个按特定键排序的词典列表。每个字典包含32个元素,列表中有4000多个字典。我需要代码来处理这个列表,并返回一个新的列表,删除所有重复项。

这些链接中的方法:

别帮我,因为字典不好用。

有什么想法吗?如果你需要更多的信息,评论和我会添加的信息。

编辑

重复字典是任何两个具有相同值的字典。


好的,这里有一个详细的解释给那些需要它的人。

我有一个字典列表,比如:

[ {
    "ID" : "0001",
    "Organization" : "SolarUSA",
    "Matchcode" : "SolarUSA, Something Street, Somewhere State, Whatev Zip",
    "Owner" : "Timothy Black",
   }, {
    "ID" : "0002",
    "Organization" : "SolarUSA",
    "Matchcode" : "SolarUSA, Something Street, Somewhere State, Whatev Zip",
    "Owner" : "Johen Wilheim",
   }, {
    "ID" : "0003",
    "Organization" : "Zapotec",
    "Matchcode" : "Zapotec, Something Street, Somewhere State, Whatev Zip",
    "Owner" : "Simeon Yurrigan",
   } ]

在这个列表中,第一个和第二个词典是重复的,因为它们的Matchcodes是相同的。

现在,此列表按以下代码排序:

# sort_by is "Matchcode"
def sort( list_to_be_sorted, sort_by ):
    return sorted(list_to_be_sorted, key=lambda k: k[sort_by])

所以我有一个按Matchcode排序的词典的整洁列表。现在我只需要遍历列表,访问list[dictionary][key],并在两个键值匹配时删除重复项。


Tags: idstreet列表字典排序sortsomethinglist
3条回答

使用itertools.groupby()按键值对词典进行分组,然后从每个组中获取第一个项。

import itertools

data =[ {
    "ID" : "0001",
    "Organization" : "SolarUSA",
    "Matchcode" : "SolarUSA, Something Street, Somewhere State, Whatev Zip",
    "Owner" : "Timothy Black",
   }, {
    "ID" : "0002",
    "Organization" : "SolarUSA",
    "Matchcode" : "SolarUSA, Something Street, Somewhere State, Whatev Zip",
    "Owner" : "Johen Wilheim",
   }, {
    "ID" : "0003",
    "Organization" : "Zapotec",
    "Matchcode" : "Zapotec, Something Street, Somewhere State, Whatev Zip",
    "Owner" : "Simeon Yurrigan",
   } ]


print [g.next() for k,g in itertools.groupby(data, lambda x: x['Matchcode'])]

给出结果

[{'Owner': 'Timothy Black',  
  'Organization': 'SolarUSA', 
  'ID': '0001',  
  'Matchcode': 'SolarUSA, Something Street, Somewhere State, Whatev Zip'},

 {'Owner': 'Simeon Yurrigan', 
  'Organization': 'Zapotec', 
  'ID': '0003', 
  'Matchcode':'Zapotec, Something Street, Somewhere State, Whatev Zip'}]

我相信这就是你要找的。

编辑:我更喜欢独特的解决方案。它更短更具描述性。

对于现在已消除歧义的问题,此答案不正确。


正如可以使用tuple来获得与list等价的哈希表一样,也可以使用frozenset来获得与dict等价的哈希表。唯一的技巧是需要将d.items()而不是d传递给构造函数。

>>> d = {'a': 1, 'b': 2}
>>> s = frozenset(d.items())
>>> hash(s)
-7588994739874264648
>>> dict(s) == d
True

然后你可以使用你最喜欢的解决方案,你已经看到。将它们转储到set中,或者如果需要保留顺序,则使用OrderedSetunique_everseen配方。例如:

>>> unique_sets = set(frozenset(d.items()) for d in list_of_dicts)
>>> unique_dicts = [dict(s) for s in unique_sets]

或者,保持顺序并使用键值:

>>> sets = (frozenset(d.items()) for d in list_of_dicts)
>>> unique_sets = unique_everseen(sets, key=operator.itemgetter(key))
>>> unique_dicts = [dict(s) for s in unique_sets]

当然,如果列表或dict嵌套在其中,则必须递归转换,就像对列表列表的转换一样。

相关问题 更多 >