我有一个列表:
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))
无法在此处正常工作,会导致错误。
我有一个列表:
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))
无法在此处正常工作,会导致错误。
如果您的值是可哈希的,那么这将起作用:
>>> [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}]
x.iteritems()
-> tuple(x.iteritems())
或者你正在比较生成器对象。 - Jochen Ritzel字典无法进行哈希操作,因此不能将它们放入集合中。一个相对有效的方法是将键值对转换为元组并对这些元组进行哈希操作(可以自行消除中间变量):
tuples = tuple(set(d.iteritems()) for d in dicts)
unique = set(tuples)
return [dict(pairs) for pairs in unique]
in
检查的 O(n^2) 方法。set(d)
会产生错误。 - Shawn Chinfrom collections import namedtuple
Point = namedtuple('Point','x y'.split())
better_d = [Point(1,2), Point(3,4), Point(1,2)]
print set(better_d)
tmp=[]
for i in d:
if i not in tmp:
tmp.append(i)
tmp
[{'x': 1, 'y': 2}, {'x': 3, 'y': 4}]
如果字典中的某个值看起来像一个列表,则元组的字典将无效。
例如:
data = [
{'a': 1, 'b': 2},
{'a': 1, 'b': 2},
{'a': 2, 'b': 3}
]
使用 [dict(y) for y in set(tuple(x.items()) for x in data)] 可以获取独特的数据。
然而,对这样的数据执行相同的操作将会失败:
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]
map(dict, set(map(lambda x: tuple(x.items()), d)))
map
并不是黑魔法,它只是一种丑陋的编写列表推导式的方式 ;) 但请注意,在 Python 2 中,这样做非常低效,因为它会创建几个中间列表(如果我数得正确的话是三个),而这些中间列表完全不需要。 - user395760l=type;y,z,l,o=(map,l({}),set,l(()));y(z,l(o(x.items())for x in d))
。与列表推导式相比,嵌套映射通常不太直观易读。 - Shawn Chinn
个二元组的元组,使用迭代器创建了一个集合,并创建了一个包含n
个字典的列表。你的代码与我的类似,只是在可以使用生成器和迭代器时没有使用它们。 - user395760
set()
会尝试对给定列表中的每个元素进行哈希。在Python中,dict
是不可哈希的,这就是为什么set(d)
会引发TypeError
错误的原因。 - Rodrigue