从列表中的嵌套字典中删除重复项

4 python dictionary

快速和非常基本的新手问题.

如果我有这样的词典列表:

L = []
L.append({"value1": value1, "value2": value2, "value3": value3, "value4": value4})
Run Code Online (Sandbox Code Playgroud)

假设存在多个条目,其中value3和value4与其他嵌套字典相同.如何快速轻松地找到并删除那些重复的词典.

保持秩序并不重要.

谢谢.

编辑:

如果有五个输入,如下所示:

L = [{"value1": fssd, "value2": dsfds, "value3": abcd, "value4": gk},
    {"value1": asdasd, "value2": asdas, "value3": dafdd, "value4": sdfsdf},
    {"value1": sdfsf, "value2": sdfsdf, "value3": abcd, "value4": gk},
    {"value1": asddas, "value2": asdsa, "value3": abcd, "value4": gk},
    {"value1": asdasd, "value2": dskksks, "value3": ldlsld, "value4": sdlsld}]
Run Code Online (Sandbox Code Playgroud)

输出应该如下所示:

L = [{"value1": fssd, "value2": dsfds, "value3": abcd, "value4": gk},
    {"value1": asdasd, "value2": asdas, "value3": dafdd, "value4": sdfsdf},
    {"value1": asdasd, "value2": dskksks, "value3": ldlsld, "value4": sdlsld}
Run Code Online (Sandbox Code Playgroud)

ars*_*ars 7

这是一种方式:

keyfunc = lambda d: (d['value3'], d['value4'])

from itertools import groupby
giter = groupby(sorted(L, key=keyfunc), keyfunc)

L2 = [g[1].next() for g in giter]
print L2
Run Code Online (Sandbox Code Playgroud)

  • 在 python3.3 中运行它并得到错误 `AttributeError: 'itertools._grouper' object has no attribute 'next'` 有任何线索吗? (2认同)

Ale*_*lli 6

在Python 2.6或3.*中:

import itertools
import pprint

L = [{"value1": "fssd", "value2": "dsfds", "value3": "abcd", "value4": "gk"},
    {"value1": "asdasd", "value2": "asdas", "value3": "dafdd", "value4": "sdfsdf"},
    {"value1": "sdfsf", "value2": "sdfsdf", "value3": "abcd", "value4": "gk"},
    {"value1": "asddas", "value2": "asdsa", "value3": "abcd", "value4": "gk"},
    {"value1": "asdasd", "value2": "dskksks", "value3": "ldlsld", "value4": "sdlsld"}]

getvals = operator.itemgetter('value3', 'value4')

L.sort(key=getvals)

result = []
for k, g in itertools.groupby(L, getvals):
    result.append(g.next())

L[:] = result
pprint.pprint(L)
Run Code Online (Sandbox Code Playgroud)

在Python 2.5中几乎相同,除了你必须在追加中使用g.next()而不是next(g).