Biorąc pod uwagę słownik, jak mogę się dowiedzieć, czy dany klucz w tym słowniku został już ustawiony na wartość inną niż Brak?
Tzn. Chcę to zrobić:
my_dict = {}
if (my_dict[key] != None):
my_dict[key] = 1
else:
my_dict[key] += 1
To znaczy, chcę zwiększyć wartość, jeśli już tam jest, lub ustawić ją na 1 w przeciwnym razie.
python
dictionary
Ben
źródło
źródło
Odpowiedzi:
Szukasz
collections.defaultdict
(dostępne dla Python 2.5+). Tozrobi co chcesz.
W przypadku zwykłych Pythonów
dict
, jeśli nie ma wartości dla danego klucza, nie dostaniesz sięNone
podczas uzyskiwania dostępu do słownika -KeyError
zostanie podniesione. Więc jeśli chcesz używać zwykłegodict
, zamiast kodu, którego byś użyłźródło
dict
, możesz to zrobićmy_dict[key] = my_dict.get(key, 0) + 1
.Wolę to zrobić w jednym wierszu kodu.
Słowniki mają funkcję get, która pobiera dwa parametry - żądany klucz i wartość domyślną, jeśli nie istnieje. Wolę tę metodę niż defaultdict, ponieważ chcesz obsłużyć przypadek, w którym klucz nie istnieje w tym jednym wierszu kodu, nie wszędzie.
źródło
Osobiście lubię używać
setdefault()
źródło
setdefault
jest niesamowite. Nie zmienia wartości, jeśli jest już ustawionasome_key
. Na przykładd={1:2}; d.setdefault(1, 0)
nie zaburza wartościd[1]
.Potrzebujesz do tego
key in dict
idiomu.Jednak prawdopodobnie powinieneś rozważyć użycie
defaultdict
(jak sugeruje dF).źródło
my_dict[key] is not None
, co jest jaśniejsze (przynajmniej IMHO)if key in my_dict and my_dict[key]:
Aby odpowiedzieć na pytanie „ jak mogę się dowiedzieć, czy dany indeks w tym dykcie został już ustawiony na wartość inną niż Brak ”, wolałbym:
Jest to zgodne z już przywołaną koncepcją EAFP (łatwiej prosić o wybaczenie niż o pozwolenie). Unika także podwójnego wyszukiwania klucza w słowniku, tak jak by to było w przypadku
key in my_dict and my_dict[key] is not None
interesujące, gdyby wyszukiwanie było drogie.W przypadku rzeczywistego problemu , który wystąpiłeś, tj. Zwiększenie wartości int, jeśli istnieje, lub ustawienie jej wartości domyślnej w innym przypadku, również polecam
jak w odpowiedzi Andrew Wilkinsona.
Istnieje trzecie rozwiązanie, jeśli przechowujesz modyfikowalne obiekty w słowniku. Typowym tego przykładem jest multimapa , w której przechowujesz listę elementów dla swoich kluczy. W takim przypadku możesz użyć:
Jeśli wartość klucza nie istnieje w słowniku, metoda setdefault ustawi drugi parametr setdefault. Zachowuje się jak standardowy my_dict [klucz], zwracając wartość klucza (która może być wartością nowo ustawioną).
źródło
Uzgodniony z Cgoldbergiem. Jak to robię to:
Więc albo zrób to jak wyżej lub użyj domyślnego dykta, jak sugerowali inni. Nie używaj instrukcji if. To nie jest Python.
źródło
+=2
lub-=1
? Musisz pamiętać o zmianie obu linii. To może wydawać się teraz trywialne, ale są to takie głupie małe „trywialne” błędy, które mogą wrócić i cię ugryźć.Jak widać z wielu odpowiedzi, istnieje kilka rozwiązań. O jednej instancji LBYL (patrz przed skokiem) jeszcze nie wspomniano, metoda has_key ():
źródło
Sposób, w jaki próbujesz to zrobić, nazywa się LBYL (spójrz przed skokiem), ponieważ sprawdzasz warunki, zanim spróbujesz zwiększyć swoją wartość.
Inne podejście nazywa się EAFP (łatwiej prosić o wybaczenie niż o pozwolenie). W takim przypadku po prostu spróbuj wykonać operację (zwiększ wartość). Jeśli się nie powiedzie, wychwytujesz wyjątek i ustawiasz wartość na 1. Jest to nieco bardziej Pythoniczny sposób na zrobienie tego (IMO).
http://mail.python.org/pipermail/python-list/2003-May/205182.html
źródło
Trochę późno, ale to powinno zadziałać.
źródło
To nie jest bezpośrednia odpowiedź na pytanie, ale dla mnie wygląda na to, że możesz chcieć funkcjonalności kolekcji .
Daje to wynik
źródło
defaultdict(int)
z pewną dodatkową funkcjonalnością, więc działałby doskonale, gdy miałby do czynienia wyłącznie z liczbami całkowitymi, ale nie pokazujesz żadnego z odpowiednich zachowań.Oto jeden linijka, którą ostatnio wymyśliłem, aby rozwiązać ten problem. Opiera się na metodzie słownika setdefault :
źródło
Szukałem tego, nie znalazłem go w Internecie, a potem spróbowałem szczęścia z Try / Error i znalazłem
źródło
__contains__
w kodzie produkcyjnym. btw.__contains__
jest taki sam jak przy użyciuis
.my_dict.__contains__(some_key)
jest równoważnesome_key in my_dict
, jest przeciążeniem dlain
operatora nieis