Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.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中从2d列表中删除重复的词典_Python_Dictionary_Duplicates - Fatal编程技术网

在python中从2d列表中删除重复的词典

在python中从2d列表中删除重复的词典,python,dictionary,duplicates,Python,Dictionary,Duplicates,我有一个2D字典列表: results = [ [{'a':1, 'b':[1,2,3]}, {'a':10, 'b':[7,8,9]}, {'a':100, 'b':[100,200,300]}], [{'a':123, 'b':[9,5,2]}, {'a':100, 'b':[100,200,300]}], [{'a':10, 'b':[7,8,9]}] ] 我想将这个2D列表展平为1D列表,然后删除重复的字典。例如,通过删除

我有一个2D字典列表:

results = [
    [{'a':1, 'b':[1,2,3]},
     {'a':10, 'b':[7,8,9]},
     {'a':100, 'b':[100,200,300]}], 
    [{'a':123, 'b':[9,5,2]},
        {'a':100, 'b':[100,200,300]}], 
    [{'a':10, 'b':[7,8,9]}]
]
我想将这个2D列表展平为1D列表,然后删除重复的字典。例如,通过删除重复项,我的意思是删除同一词典的多个条目,如第一个和第二个列表中的
{'a':100,'b':[100200300]}
。目前我正在使用以下技术

from itertools import chain
x = list(chain.from_iterable(results)) # Flattens the list of dicts
y = [dict(t) for t in set([tuple(d.items()) for d in x])]
但最后一次抛出以下错误

Traceback (most recent call last):
  File "/home/user/PycharmProjects/myapp/main.py", line 122, in <module>
    y = [dict(t) for t in set([tuple(d.items()) for d in x])]
TypeError: unhashable type: 'list'

有没有人能指导我这是不是一个正确的方法。如果不是,那么更好、正确的方法是什么?谢谢

这是一个非常简单的方法:

set_results = []
for r in results:
    for sub_r in r:
        if not sub_r in set_results:
            set_results.append(sub_r)
输出:

[{'a': 1, 'b': [1, 2, 3]},
 {'a': 10, 'b': [7, 8, 9]},
 {'a': 100, 'b': [100, 200, 300]},
 {'a': 123, 'b': [9, 5, 2]}]

这是一个非常简单的方法:

set_results = []
for r in results:
    for sub_r in r:
        if not sub_r in set_results:
            set_results.append(sub_r)
输出:

[{'a': 1, 'b': [1, 2, 3]},
 {'a': 10, 'b': [7, 8, 9]},
 {'a': 100, 'b': [100, 200, 300]},
 {'a': 123, 'b': [9, 5, 2]}]

您可以这样制作平面列表:

in_list = [
   [
    {'a':1, 'b':[1,2,3]},
    {'a':10, 'b':[7,8,9]},
    {'a':100, 'b':[100,200,300]}
   ], 

   [
     {'a':123, 'b':[9,5,2]},
     {'a':100, 'b':[100,200,300]}
   ], 

   [
    {'a':10, 'b':[7,8,9]}
   ]
]

l = [i for d in results for i in in_list]
这将输出:

[
  {'b': [1, 2, 3], 'a': 1}, 
  {'b': [7, 8, 9], 'a': 10}, 
  {'b': [100, 200, 300], 'a': 100}, 
  {'b': [9, 5, 2], 'a': 123}, 
  {'b': [100, 200, 300], 'a': 100}, 
  {'b': [7, 8, 9], 'a': 10}
]
现在,要删除重复项,可以使用来对类似元素进行分组。您需要将组键指定为这两个元素

  from itertools import groupby
  from operator import itergetter

  r = [k for k,g in list(itertools.groupby(sorted([[(k,v) for k,v in d.items()] for d in l]), itemgetter(0,1)))]
这将输出

 [
   (('b', [1, 2, 3]), ('a', 1)), 
   (('b', [7, 8, 9]), ('a', 10)), 
   (('b', [9, 5, 2]), ('a', 123)), 
   (('b', [100, 200, 300]), ('a', 100))
 ]
 [
  {'b': [1, 2, 3], 'a': 1}, 
  {'b': [7, 8, 9], 'a': 10}, 
  {'b': [9, 5, 2], 'a': 123}, 
  {'b': [100, 200, 300], 'a': 100}
 ]
最后将此序列转换为dict以获得所需的输出

 [dict(e) for e in r]
这将输出

 [
   (('b', [1, 2, 3]), ('a', 1)), 
   (('b', [7, 8, 9]), ('a', 10)), 
   (('b', [9, 5, 2]), ('a', 123)), 
   (('b', [100, 200, 300]), ('a', 100))
 ]
 [
  {'b': [1, 2, 3], 'a': 1}, 
  {'b': [7, 8, 9], 'a': 10}, 
  {'b': [9, 5, 2], 'a': 123}, 
  {'b': [100, 200, 300], 'a': 100}
 ]

您可以这样制作平面列表:

in_list = [
   [
    {'a':1, 'b':[1,2,3]},
    {'a':10, 'b':[7,8,9]},
    {'a':100, 'b':[100,200,300]}
   ], 

   [
     {'a':123, 'b':[9,5,2]},
     {'a':100, 'b':[100,200,300]}
   ], 

   [
    {'a':10, 'b':[7,8,9]}
   ]
]

l = [i for d in results for i in in_list]
这将输出:

[
  {'b': [1, 2, 3], 'a': 1}, 
  {'b': [7, 8, 9], 'a': 10}, 
  {'b': [100, 200, 300], 'a': 100}, 
  {'b': [9, 5, 2], 'a': 123}, 
  {'b': [100, 200, 300], 'a': 100}, 
  {'b': [7, 8, 9], 'a': 10}
]
现在,要删除重复项,可以使用来对类似元素进行分组。您需要将组键指定为这两个元素

  from itertools import groupby
  from operator import itergetter

  r = [k for k,g in list(itertools.groupby(sorted([[(k,v) for k,v in d.items()] for d in l]), itemgetter(0,1)))]
这将输出

 [
   (('b', [1, 2, 3]), ('a', 1)), 
   (('b', [7, 8, 9]), ('a', 10)), 
   (('b', [9, 5, 2]), ('a', 123)), 
   (('b', [100, 200, 300]), ('a', 100))
 ]
 [
  {'b': [1, 2, 3], 'a': 1}, 
  {'b': [7, 8, 9], 'a': 10}, 
  {'b': [9, 5, 2], 'a': 123}, 
  {'b': [100, 200, 300], 'a': 100}
 ]
最后将此序列转换为dict以获得所需的输出

 [dict(e) for e in r]
这将输出

 [
   (('b', [1, 2, 3]), ('a', 1)), 
   (('b', [7, 8, 9]), ('a', 10)), 
   (('b', [9, 5, 2]), ('a', 123)), 
   (('b', [100, 200, 300]), ('a', 100))
 ]
 [
  {'b': [1, 2, 3], 'a': 1}, 
  {'b': [7, 8, 9], 'a': 10}, 
  {'b': [9, 5, 2], 'a': 123}, 
  {'b': [100, 200, 300], 'a': 100}
 ]

您可以通过
[i for d in results for i in d]
将dict列表展开。对于重复数据消除,您没有指定标准。@GarbageCollector请查看编辑。您可以给我们提供预期的输出吗?您可以通过
[i in d的结果中的i For d]调整dict列表。
。对于重复数据消除,您没有指定标准。@GarbageCollector请查看编辑。您能给我们提供预期的输出吗?