从python中的2d列表中删除重复的词典
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从python中的2d列表中删除重复的词典相关的知识,希望对你有一定的参考价值。
我有一个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列表展平为一维列表,然后删除重复的词典。通过删除重复项,我的意思是例如删除第一个和第二个列表中的{'a':100, 'b':[100,200,300]}
相同字典的多个条目。目前我正在使用以下技术
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'
预期的输出将是单个唯一的序列列表,如下所示
[
{'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}
]
现在要删除重复项,您可以使用itertools.groupby对类似元素进行分组。您需要将组键指定为两个元素
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))
]
最后将此序列转换为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}
]
以上是关于从python中的2d列表中删除重复的词典的主要内容,如果未能解决你的问题,请参考以下文章