Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 删除目录列表中的某些元素_Python_List_Dictionary - Fatal编程技术网

Python 删除目录列表中的某些元素

Python 删除目录列表中的某些元素,python,list,dictionary,Python,List,Dictionary,以下是我的口述: l1=[{"key1":"a1","key2":"a2"}, {"key1":"b1","key2":"b2"}, {"key1":"c1","key2":"c2"}, {"key1":"a2"

以下是我的口述:

l1=[{"key1":"a1","key2":"a2"}, {"key1":"b1","key2":"b2"},
    {"key1":"c1","key2":"c2"}, {"key1":"a2","key2":"a1"},
    {"key1":"c2","key2":"c1"}, ....]
我想删除dict中重复的元素。例如,如果我有a1和a2,一旦在dict列表中,我就不再需要它们了。因此,在上面的示例中,我不需要dict

{"key1":"a2","key2":"a1"},{"key1":"c2","key2":"c1"}
如何删除它们? 基本上,我想删除具有相同值的dict,而不考虑它们的顺序。 我尝试了以下代码:

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
键下收集源列表内部dict的值,并将实际dict作为值收集

迭代
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) 
输出:

# 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(list)
frozenset
的键下收集源列表内部dict的值,并将实际dict作为值收集

迭代
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) 
输出:

# 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'}]

l1是一个列表,而不是dict。当元素以相同的方式填充dict时,是否要删除列表中的重复元素?键1和键2中的a1和a2是否存在差异,它们是如何复制的?那些不是复制的-一个dict有
'key1'='a2'
另一个
'key1'='a1'
,反之亦然-请提供更好的/更多的示例和推理。@PatrickArtner我想删除基于值而不是基于键的dict,我想删除具有相同内容的dictsvalues@sahasrara62是的,它们是不同的,但这在我的例子中并不重要,因为我想删除具有相同值的dict,无论它们是否分配给同一个键。l1是一个列表,而不是dict。当元素以相同的方式填充时,您想删除列表中的重复元素dicts?a1和a2在key1和key2中不是有区别吗?它们是如何复制的?它们不是重复的-一个dict有
'key1'='a2'
,另一个
'key1'='a1'
,反之亦然-请提供更好/更多的示例和推理。@PatrickArtner我想删除基于值而不是基于键的dicts,我想删除具有相同内容的dictsvalues@sahasrara62是的,它们是不同的,但这在我的例子中并不重要,因为我想删除具有相同值的dict,无论它们是否分配给相同的键,当我使用defaultdict时,从那一行开始的代码已经不起作用了。它是一个非常复杂的东西。它和版本有关吗?@sam version thing?你用什么版本?如果您这样做,您也可以使用普通dict:
d={};对于l1:d.setdefault(frozenset(internal.values(),[]).append(internal)
-这是一个性能稍差的想法当我使用defaultdict时,从那一行开始的代码不再工作了。它是一个wierd的东西。它与版本有关吗?@sam version thing?你用什么版本?如果您这样做,您也可以使用普通dict:
d={};对于l1中的内部:d.setdefault(frozenset(internal.values()),[]).append(internal)
-这在某种程度上不如dict的性能