从列表中嵌套字典去重
这是一个快速且非常基础的新手问题。
假设我有一个字典列表,长得像这样:
L = []
L.append({"value1": value1, "value2": value2, "value3": value3, "value4": value4})
假设有多个条目,其中的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}]
输出应该看起来像这样:
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}
6 个回答
2
你可以使用一个临时数组来存储物品的字典。之前的代码在循环中删除物品时出现了问题。
(v,r) = ([],[])
for i in l:
if ('value4', i['value4']) not in v and ('value3', i['value3']) not in v:
r.append(i)
v.extend(i.items())
l = r
你的测试:
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'}]
输出结果
{'value4': 'gk', 'value3': 'abcd', 'value2': 'dsfds', 'value1': 'fssd'}
{'value4': 'sdfsdf', 'value3': 'dafdd', 'value2': 'asdas', 'value1': 'asdasd'}
{'value4': 'sdlsld', 'value3': 'ldlsld', 'value2': 'dskksks', 'value1': 'asdasd'}
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
7
在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(next(g))
L[:] = result
pprint.pprint(L)
在Python 2.5中几乎是一样的,只是你需要在添加内容时用 g.next()
来代替 next(g)
。