Дубликаты в словаре (Python)

#python #dictionary

#python #словарь

Вопрос:

Мне нужно написать функцию, которая возвращает true, если в словаре есть дубликаты. Так что в значительной степени, если что-либо появится в словаре более одного раза, оно вернет 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)
  

Комментарии:

1. вы ищете уникальные ключи или значения, потому что, как уже упоминал @Raymond, словарь имеет уникальные ключи.

2. Кроме того, ваш d = {"a", "b", "c"} набор, а не словарь

3. Создайте набор уникальных значений и посмотрите, имеет ли он одинаковую длину. Если вам нужна более подробная информация, я предлагаю использовать счетчик коллекций docs.python.org/library/collections.html#collections . Счетчик

4. @Petr Viktorin: Какой смысл было менять set() (минимальный и обычный способ получения пустого набора) на set({}) ?

5. @JohnMachin: я скопировал в редактор, сделал отступ и вставил обратно. Я не знаю, как я добавил {} в процессе, но теперь я изменил его обратно. Спасибо за уловку.

Ответ №1:

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

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

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

Выводит:

 True
  

Комментарии:

1. Есть ли способ проверить только дубликаты не пустых значений?

Ответ №2:

 def has_duplicates(d):
    return False
  

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

Если вы хотите найти повторяющиеся значения, это

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

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

Комментарии:

1. Милый ответ на некорректный вопрос.

2. Хотел бы я дать вам еще 1 за этот умный тест повторяющихся значений.

Ответ №3:

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

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

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

Ответ №4:

Словари Python уже имеют уникальные ключи.

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

 set(d.values())
  

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

Ответ №5:

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

Ответ №6:

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

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

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

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

 len(d1) != func(d1)
  

К счастью, Python позволяет легко сделать это с помощью sets . Простого преобразования d1 в a 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 встречается два раза. Один из способов взглянуть на набор состоит в том, что это список без повторяющихся элементов. Это то, что видит print, когда выводит набор в виде списка в квадратных скобках. Другой способ взглянуть на это как на dict без значений. Как и во многих действиях по обработке данных, вам нужно начать selecting с интересующих вас данных, а затем манипулировать ими. Начните с выбора значений из dict, затем создайте набор, затем посчитайте и сравните.

Ответ №7:

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

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

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

 >>> d = {'a': 0, 'b':1}
>>> d['a'] = 2
>>> print d
{'a': 2, 'b': 1}