Дубликаты в словаре (Python) - PullRequest
1 голос
/ 01 ноября 2011

Мне нужно написать функцию, которая возвращает true, если в словаре есть дубликаты.Так что если что-нибудь появится в словаре несколько раз, оно вернет истину.

Вот что у меня есть, но я очень далеко и не знаю, что делать.

d = {"a", "b", "c"}

def has_duplicates(d):
    seen = set()
    d={}
    for x in d:
        if x in seen:
            return True
        seen.add(x)
    return False

print has_duplicates(d)

Ответы [ 7 ]

7 голосов
/ 01 ноября 2011
def has_duplicates(d):
    return False

Словари никогда не содержат дубликатов ключей. Ваша функция, между прочим, эквивалентна этому определению, поэтому она правильная (немного длиннее).

Если вы хотите найти дубликаты значений , это

len(set(d.values())) != len(d)

при условии, что значения могут быть хэшируемыми.

6 голосов
/ 01 ноября 2011

Если вы хотите найти дублирование в значениях словаря:

def has_duplicates(d):
    return len(d) != len(set(d.values()))

print has_duplicates({'a': 1, 'b': 1, 'c': 2})

Выходы:

True
3 голосов
/ 01 ноября 2011

В вашем коде d = {"a", "b", "c"}, d - это набор, а не словарь.

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

def has_duplicate_values(d):
    return len(set(d.values())) != len(d)
1 голос
/ 01 ноября 2011

В словарях Python уже есть уникальные ключи.

Возможно, вас интересуют уникальные значения?

set(d.values())

Если это так, вы можете проверить длину этого набора, чтобы убедиться, что он меньше.чем количество значений.Это работает, потому что наборы исключают дубликаты из входных данных, поэтому, если результат меньше, чем входной, это означает, что некоторые дубликаты были найдены и удалены.

0 голосов
/ 01 ноября 2011

Единственное, что словарь может иметь дубликаты, это значения. Словарь - это ключ, хранилище значений, где ключи уникальны. В Python вы можете создать словарь так:

d1 = {k1: v1, k2: v2, k3: v1}
d2 = [k1, v1, k2, v2, k3, v1]

d1 было создано с использованием обычной словарной нотации. d2 был создан из list с четным количеством элементов. Обратите внимание, что обе версии имеют повторяющиеся значения.

Если у вас есть функция, которая возвращает количество уникальных значений в словаре, вы можете сказать что-то вроде:

len(d1) != func(d1)

К счастью, Python делает это легко, используя sets. Простого преобразования d1 в set недостаточно. Давайте сделаем наши ключи и значения реальными, чтобы вы могли запустить некоторый код.

v1 = 1; v2 = 2
k1 = "a"; k2 = "b"; k3 = "c"
d1 = {k1: v1, k2: v2, k3: v1}
print len(d1)
s = set(d1)
print s

Вы заметите, что s также имеет трех членов и выглядит как set(['c', 'b', 'a']). Это потому, что простое преобразование использует только ключи в dict. Вы хотите использовать значения следующим образом:

s = set(d1.values())
print s

Как вы можете видеть, есть только два элемента, потому что значение 1 встречается два раза. Один из способов просмотра набора состоит в том, что это список без дублирующих элементов. Вот что печатает, когда печатает набор в виде списка в скобках. Еще один способ взглянуть на это - как диктат без ценностей. Как и во многих действиях по обработке данных, вам нужно начать с selecting интересующих вас данных, а затем манипулировать ими. Начните с выбора значений из dict, затем создайте набор, затем посчитайте и сравните.

0 голосов
/ 01 ноября 2011

Не только ваше общее предположение о том, что словари могут иметь дубликаты ключей, но и ваша реализация серьезно ошибочна: d={} означает, что вы потеряли из виду введенный вами d arg и обрабатываете пустой словарь!

0 голосов
/ 01 ноября 2011

Это не словарь, это набор:

d = {"a", "b", "c"}

Я не знаю, что вы пытаетесь сделать, но вы не можете иметь словари с одним и тем же ключом.Если у вас есть:

>>> d = {'a': 0, 'b':1}
>>> d['a'] = 2
>>> print d
{'a': 2, 'b': 1}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...