Wydaje się to być tak oczywistą rzeczą, że czuję, że czegoś brakuje, ale jak się dowiedzieć, czy dwa różne klucze w tym samym słowniku mają dokładnie taką samą wartość? Na przykład, jeśli masz słownik test
z kluczami a
, b
i c
, a klucze a
i b
mają wartość 10, jak byś to rozgryzł? (W tym miejscu proszę przyjąć dużą liczbę kluczy, powiedzmy 100, i nie masz żadnej wiedzy na temat liczby duplikatów, jeśli istnieje wiele zestawów duplikatów lub jeśli w ogóle są duplikaty). Dzięki.Jak sprawdzić, czy dwa klucze w dyktafonie mają tę samą wartość?
Odpowiedz
Aby wykryć wszystkich tych przypadkach:
>>> import collections
>>> d = {"a": 10, "b": 15, "c": 10}
>>> value_to_key = collections.defaultdict(list)
>>> for k, v in d.iteritems():
... value_to_key[v].append(k)
...
>>> value_to_key
defaultdict(<type 'list'>, {10: ['a', 'c'], 15: ['b']})
@hivert sprawia, że to doskonały punkt działa tylko wtedy, gdy wartości są hashable. Jeśli tak nie jest, nie ma fajnego rozwiązania O (n) (niestety). To jest najlepsze, co mogę wymyślić:
d = {"a": [10, 15], "b": [10, 20], "c": [10, 15]}
values = []
for k, v in d.iteritems():
must_insert = True
for val in values:
if val[0] == v:
val[1].append(k)
must_insert = False
break
if must_insert: values.append([v, [k]])
print [v for v in values if len(v[1]) > 1] #prints [[[10, 15], ['a', 'c']]]
@Ben dobry punkt, przy założeniu, że mam rozumieć co Kpower próbuje wykryć, mam edytowane w roztworze, który powinien rozwiązać problem. –
Działa to również tylko wtedy, gdy wartości są nieosiągalne. Zastanów się na przykład, co się dzieje, gdy wartości są listami. – hivert
@hivert yes Zauważyłem to z innych komentarzy. Nie ma ładnego (O (n)) rozwiązania problemu, jeśli wartości nie są nieosiągalne, o ile wiem. –
len(dictionary.values()) == len(set(dictionary.values()))
to przy założeniu, że jedyną rzeczą, którą chcesz wiedzieć, czy istnieją zduplikowane wartości, nie których wartości są duplikaty, które jest co Przyjąłem z twojego pytania. Daj mi znać, jeśli źle zinterpretowałem pytanie.
Zasadniczo chodzi tylko o sprawdzenie, czy jakiekolwiek wpisy zostały usunięte, gdy wartości słownika zostały rzucone do obiektu, który z definicji nie ma żadnych duplikatów.
Jeśli powyższe nie działa dla swoich celów, powinno to być lepszym rozwiązaniem:
set(k for k,v in d.items() if d.values().count(v) > 1))
Zasadniczo druga wersja tylko sprawdza, czy istnieje więcej niż jeden wpis, który zostanie usunięty, jeśli spróbuj wyskoczyć z listy.
wybudować kolejny dict Mapowanie wartości pierwszej dict do wszystkich klawiszy, które utrzymują, że wartość:
import collections
inverse_dict = collections.defaultdict(list)
for key in original_dict:
inverse_dict[original_dict[key]].append(key)
Działa to tylko wtedy, gdy wartości są nieosiągalne. – hivert
dico = {'a':0, 'b':0, 'c':1}
result = {}
for val in dico:
if dico[val] in result:
result[dico[val]].append(val)
else:
result[dico[val]] = [val]
>>> result
{0: ['a', 'b'], 1: ['c']}
Następnie można filtrować na klucz wynikiem, że ma wartość (lista) z więcej niż jeden element, np Znaleziono duplikat:
Możesz powiedzieć , które są duplikatami za pomocą odwrotnego indeksu - gdzie klucz jest duplikatem, a wartość jest zbiorem kluczy, które mają tę wartość (to zadziała jako ile wartości w słowniku wejściowego są hashable):
from collections import defaultdict
d = {'w':20, 'x':10, 'y':20, 'z':30, 'a':10}
dd = defaultdict(set)
for k, v in d.items():
dd[v].add(k)
dd = { k : v for k, v in dd.items() if len(v) > 1 }
dd
=> {10: set(['a', 'x']), 20: set(['y', 'w'])}
Od tego ostatniego wyniku jest to łatwe do uzyskania zestaw kluczy z dwóch wartości:
set.union(*dd.values())
=> set(['y', 'x', 'a', 'w'])
keys = set()
for key1 in d:
for key2 in d:
if key1 == key2: continue
if d[key1] == d[key2]:
keys |= {key1, key2}
tj. To Θ (n²), co chcesz. Powodem jest to, że dykt nie zapewnia Θ (1) wyszukiwania klucza, któremu przypisano wartość. Więc lepiej przemyślcie swoje wybory struktury danych, jeśli to nie wystarczy.
- 1. Python: Jak sprawdzić, czy dwa słowniki mają te same klucze?
- 2. Jeden obiekt dwa klucze obce na tę samą tabelę
- 3. Dlaczego * curr i curr-> val mają tę samą wartość?
- 4. Dlaczego różne stałe animacji bloku mają tę samą wartość?
- 5. Sprawdź, czy wszystkie elementy mają tę samą klasę
- 6. Policz tę samą wartość w tablicy
- 7. Czy dwa deklaratywne modele SQLAlchemy mają tę samą deklaratywną bazę danych()?
- 8. Jak przetestować dwa terminy dateTimes na tę samą datę?
- 9. sprawdź, czy wszystkie elementy tablicy mają tę samą wartość w Swift
- 10. sprawdzanie, czy cztery zmienne binarne mają taką samą wartość, nieoczywistą?
- 11. System.Random nadal zwraca tę samą wartość
- 12. W jQuery, w jaki sposób uzyskać wartość przycisku opcji, gdy wszystkie mają tę samą nazwę?
- 13. Proces VS wątku: czy dwa procesy mogą współużytkować tę samą pamięć współdzieloną? czy dwa wątki?
- 14. Włóż nowy DIV między dwa DIV, które mają tę samą klasę i są natychmiastowymi rodzeństwami
- 15. Różni użytkownicy otrzymują tę samą wartość cookie w .ASPXANONYMOUS
- 16. Porównaj dwie tablice obiektów i usuń elementy w drugiej, które mają tę samą wartość właściwości
- 17. Skycons, cant wyświetlają tę samą ikonę dwa razy?
- 18. Jak sprawdzić, czy dane wejściowe formularza mają wartość
- 19. Dlaczego funkcja Object.hashCode() zwraca tę samą wartość w różnych przebiegach
- 20. Sprawdzenie czy dwie daty mają informacji samą datę
- 21. Dlaczego otrzymuję tę samą wartość przesunięcia i pozycji w jQuery?
- 22. Czy przetworniki Clojure mają tę samą koncepcję, co pośrednie operacje na strumieniach w Javie?
- 23. Sprawdź, czy dwie macierze mają tę samą zawartość (w dowolnej kolejności).
- 24. Czy mogę zadeklarować tę samą zmienną dwa razy w różnych pętlach w JavaScript?
- 25. Wstaw tę samą ustaloną wartość do wielu wierszy.
- 26. Czy mogę wielokrotnie dodać tę samą funkcję DataRow do DataTable?
- 27. Czy biblioteki Scala mają tę samą konwencję odwróconej domeny, aby nazwać pakiety jako Java?
- 28. Jak zaimplementować interfejs w VB.Net, gdy dwie metody mają tę samą nazwę, ale różne parametry
- 29. Jak sprawdzić, czy słownik zawiera określone klucze?
- 30. Jak udostępnić tę samą zmienną między modułami?
Nie powinno być żadnych duplikatów kluczy w dyktowaniu ... Chyba że masz na myśli, te, które są takie same między dwoma osobnymi dyktami. – Izkata
klucze nie będą duplikować, ale różne klucze mogą mieć te same wartości.Próbuję zrozumieć, jak dowiedzieć się, które klucze mają te same wartości. – Kpower
Myślę, że oznacza on wartości duplikatów dla różnych kluczy. Przynajmniej tak sugeruje przykład. – mr2ert