首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从python的2d列表中删除重复的字典

从python的2d列表中删除重复的字典
EN

Stack Overflow用户
提问于 2017-12-28 16:25:37
回答 2查看 129关注 0票数 0

我有一个字典的2D列表:

代码语言:javascript
复制
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':[100,200,300]}。目前,我正在使用以下技术

代码语言:javascript
复制
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])]

但最后一次抛出以下错误

代码语言:javascript
复制
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'

预期的输出将是一个唯一的字典列表,如下所示

代码语言:javascript
复制
[
    {'a':1, 'b':[1,2,3]},
     {'a':10, 'b':[7,8,9]},
     {'a':100, 'b':[100,200,300]}, 
    {'a':123, 'b':[9,5,2]},
]

如果这是一种正确的方法,有人能指导我吗?如果不是,那么什么是更好和正确的方法?谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-28 16:42:36

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

代码语言:javascript
复制
set_results = []
for r in results:
    for sub_r in r:
        if not sub_r in set_results:
            set_results.append(sub_r)

输出:

代码语言:javascript
复制
[{'a': 1, 'b': [1, 2, 3]},
 {'a': 10, 'b': [7, 8, 9]},
 {'a': 100, 'b': [100, 200, 300]},
 {'a': 123, 'b': [9, 5, 2]}]
票数 3
EN

Stack Overflow用户

发布于 2017-12-28 17:42:10

您可以像这样创建平面列表:

代码语言:javascript
复制
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]

这将输出:

代码语言:javascript
复制
[
  {'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对相似的元素进行分组。您需要将组密钥指定为这两个元素

代码语言:javascript
复制
  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)))]

这将输出

代码语言:javascript
复制
 [
   (('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,以获得所需的输出

代码语言:javascript
复制
 [dict(e) for e in r]

这将输出

代码语言:javascript
复制
 [
  {'b': [1, 2, 3], 'a': 1}, 
  {'b': [7, 8, 9], 'a': 10}, 
  {'b': [9, 5, 2], 'a': 123}, 
  {'b': [100, 200, 300], 'a': 100}
 ]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48004089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档