繁体   English   中英

删除字典列表中的某些元素

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM