如何在python中统一dict列表

时间:2011-06-08 15:04:29

标签: python

我有一个清单:

d = [{'x':1, 'y':2}, {'x':3, 'y':4}, {'x':1, 'y':2}]

{'x':1, 'y':2}不止一次我想从列表中删除它。我的结果应该是:

 d = [{'x':1, 'y':2}, {'x':3, 'y':4} ]

注意:  list(set(d))在此处无法发挥错误。

6 个答案:

答案 0 :(得分:20)

如果您的值可以使用,则可以使用:

>>> [dict(y) for y in set(tuple(x.items()) for x in d)]
[{'y': 4, 'x': 3}, {'y': 2, 'x': 1}]

编辑:

我尝试了它没有重复,似乎工作正常

>>> d = [{'x':1, 'y':2}, {'x':3, 'y':4}]
>>> [dict(y) for y in set(tuple(x.items()) for x in d)]
[{'y': 4, 'x': 3}, {'y': 2, 'x': 1}]

>>> d = [{'x':1,'y':2}]
>>> [dict(y) for y in set(tuple(x.items()) for x in d)]
[{'y': 2, 'x': 1}]

答案 1 :(得分:8)

Dicts不可清洗,所以你不能把它们放在一套。 相对有效的方法是将(key, value)对转换为元组并对这些元组进行散列(随意消除中间变量):

tuples = tuple(set(d.iteritems()) for d in dicts)
unique = set(tuples)
return [dict(pairs) for pairs in unique]

如果值并不总是可以使用,则根本不可能使用集合,并且您必须使用每个元素in检查来使用O(n ^ 2)方法。

答案 2 :(得分:6)

避免这整个问题,而是使用命名元组

from collections import namedtuple

Point = namedtuple('Point','x y'.split())
better_d = [Point(1,2), Point(3,4), Point(1,2)]
print set(better_d)

答案 3 :(得分:2)

一个简单的循环:

tmp=[]

for i in d:
    if i not in tmp:
        tmp.append(i)        
tmp
[{'x': 1, 'y': 2}, {'x': 3, 'y': 4}]

答案 4 :(得分:0)

另一个黑暗魔法(请不要打败我):

map(dict, set(map(lambda x: tuple(x.items()), d)))

答案 5 :(得分:0)

如果一个字典项目的值看起来像一个列表,则将字典变成不行。

例如

data = [
  {'a': 1, 'b': 2},
  {'a': 1, 'b': 2},
  {'a': 2, 'b': 3}
]

使用 [set中的y的dict(y)(数据中的x的tuple(x.items()))] 将获得唯一数据。

但是,对此类数据执行的相同操作将失败:

data = [
  {'a': 1, 'b': 2, 'c': [1,2]},
  {'a': 1, 'b': 2, 'c': [1,2]},
  {'a': 2, 'b': 3, 'c': [3]}
]

忽略性能,json dumps/loads可能是一个不错的选择。

data = set([json.dumps(d) for d in data])
data = [json.loads(d) for d in data]