[英]How to efficiently remove elements from dicts that have certain value patterns?
[英]Remove certain elements in a list of dicts
我有以下 dicts 列表如下:
l1=[{"key1":"a1","key2":"a2"}, {"key1":"b1","key2":"b2"},
{"key1":"c1","key2":"c2"}, {"key1":"a2","key2":"a1"},
{"key1":"c2","key2":"c1"}, ....]
我想删除dict中的重复元素。例如,如果我有a1和a2,一旦在dicts列表中,我就不想再使用它们了。所以,在上面的例子中,我不想要dicts
{"key1":"a2","key2":"a1"},{"key1":"c2","key2":"c1"}
如何删除它们? 基本上我想删除具有相同值的字典,而不管它们的顺序如何。 我尝试了以下代码:
for i in range(0,len(l1)):
for key,val in l1[i].items():
if l[i][key]==l[i+1][key]
del l[i+1][key]
这不起作用
使用defaultdict(list)
收集源列表内部字典的值的frozenset
键,并将实际字典收集为值。
迭代defaultdict(list)
并保留其每个值列表的第一个条目:
l1=[{"key1":"a1","key2":"a2"},{"key1":"b1","key2":"b2"},
{"key1":"c1","key2":"c2"},{"key1":"a2","key2":"a1"},
{"key1":"c2","key2":"c1"}]
from collections import defaultdict
d = defaultdict(list)
# store dicts under the values of itself - use frozendict for key to
# ignore order of values
for inner in l1:
d[frozenset(inner.values())].append(inner)
# construct new dict by f.e. keeping the first dict out of each list
l2 = [v[0] for _,v in d.items()]
# pretty print them
from pprint import pprint
pprint(d)
pprint(l2)
Output:
# intermediate dict
defaultdict(<class 'list'>,
{frozenset({'a1', 'a2'}): [{'key1': 'a1', 'key2': 'a2'},
{'key1': 'a2', 'key2': 'a1'}],
frozenset({'b2', 'b1'}): [{'key1': 'b1', 'key2': 'b2'}],
frozenset({'c1', 'c2'}): [{'key1': 'c1', 'key2': 'c2'},
{'key1': 'c2', 'key2': 'c1'}]})
# resulting dict
[{'key1': 'a1', 'key2': 'a2'},
{'key1': 'b1', 'key2': 'b2'},
{'key1': 'c1', 'key2': 'c2'}]
见defaultdict abd漂亮的打印机
如果你不能使用 defaultdict,你也可以使用一个普通的 - 它只是没有那么高性能:
d = {}
for inner in l1:
d.setdefault(frozenset(inner.values()),[]).append(inner)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.