Подтвердить что ты не робот

Как унифицировать список dict в 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)) здесь не работает, вызывая ошибку.

4b9b3361

Ответ 1

Если ваше значение хешируется, это будет работать:

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

EDIT:

Я пробовал это без дубликатов, и, похоже, он работал нормально

>>> 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}]

Ответ 2

Дикты не хешируются, поэтому вы не можете поместить их в набор. Относительно эффективным подходом были бы превращения пар (key, value) в кортеж и хэширование этих кортежей (не стесняйтесь исключать промежуточные переменные):

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

Если значения не всегда хешируются, это невозможно вообще с помощью наборов, и вам будет удобно использовать подход O (n ^ 2), используя проверку in для каждого элемента.

Ответ 3

Избегайте всей этой проблемы и вместо этого используйте namedtuples

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)

Ответ 4

Простая петля:

tmp=[]

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

Ответ 5

Еще одна темная магия (пожалуйста, не бить меня):

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