2014-12-12 3 views
1

Нужна помощь здесь, как я почесал голову за последний час по этой проблеме:Удаление повторяющихся элементов по значению в Словаре

items = {1: {'title': u'testing123', 'description': u'testing456'}, 
2: {'title': u'testing123', 'description': u'testing456'}, 
3: {'title': u'testing123', 'description': u'testing456'}, 
4: {'title': u'testing123', 'description': u'testing456'}, 
5: {'title': u'testing123', 'description': u'testing456'}, 
6: {'title': u'something', 'description': u'somethingelse'}} 

itemscopy = items.copy() 

for key1, val1 in itemscopy.iteritems(): 
    for key2, val2 in itemscopy.iteritems(): 
     if val1.get('description') == val2.get('description'): 
      del items[key2] 

Я пытаюсь удалить дубликаты из items Dict, таким образом, что результат исключает все дубликаты, однако, я удалить их все совершенно так, что мой конечный результат:

{6: {'title': u'something', 'description': u'somethingelse'}} 

Когда он должен быть:

{1: {'title': u'testing123', 'description': u'testing456'}, 6: {'title': u'something', 'description': u'somethingelse'}} 
+0

Вы «описание» дважды в качестве ключа внутри такой же словарь. Ключи должны быть уникальными –

+0

в вашем dict, нет 6: {'description': u'somethingelse ',' title ': u'somethingelse'}. Как вы получаете это как окончательный результат? – GLHF

ответ

2

Сделайте еще один словарь, который имеет значения, как ключи, и проверить на что

vals_seen = {} 
for key, val in itemscopy.iteritems(): 
    if val['description'] in vals_seen: 
     del items[key] 
    else: 
     vals_seen[val['description']] = 1 
+0

Я получаю 'TypeError: unhashable type: 'dict'' on' if vals_seen [val]: ' –

+0

Исправлено. Я использовал всю строку как ключ, а не только поле 'description'. – Barmar

+0

Работает красиво. Спасибо, сэр!!! –

3

Вы можете создать свою собственную функцию. Я использую Python 3, но я думаю, что только незначительные изменения - это функция items класса dict и способ обработки исключений (синтаксис).

def remove_by_value(d, value): 
    key = 0 
    for k, v in d.items(): # iteritems 
     if v == value: 
      key = k 
      break 
    try: 
     del d[key] # in case the value is not in the dictionary 
    except KeyError: 
     print('value not in the dictionary') 
    return d 

d = {"12":12, "14":14, "28":28} 

print(remove_by_value(d, 28)) # print 
0

Таким образом, для каждого элемента вы хотите узнать, существует ли его значение в других.

Проблема вашего кода в том, что вы проверяете ключ 1 на себя. Вы можете исключить этот случай непосредственно в if, добавив and key1 != key2.

Если вы инвертируете dict на значение, которое должно быть уникальным (или значениями, используя кортеж), вы получите тот же результат.

0

Это, как я хотел бы сделать это:

def customCount(value, d): 
    return len([key for key in d if d[key]==value]) 

RemovedDuplicateDict = {k:items[k] for k in items.keys() if customCount(items[k], items) < 2} 
Смежные вопросы