Szukam odpowiednika dictionary.get(key, default)
list w pythonie . Czy istnieje jeden idiom liniowy, aby uzyskać n-ty element listy lub wartość domyślną, jeśli nie jest dostępna?
Na przykład, biorąc pod uwagę listę mojaLista, którą chciałbym uzyskać myList[0]
, lub 5, jeśli myList
jest to pusta lista.
Dzięki.
index == -1000000
powinien wrócićdefault
.x[index] if 0 <= index < len(x) else default
byłoby lepiej, gdybyindex
kiedykolwiek mogło być negatywne.valid_index()
jest nieprawidłowy. Indeksy ujemne są legalne w Pythonie - powinno być-len(l) <= index < len(l)
.Edycja: usunąłem sprawdzanie TypeError - prawdopodobnie lepiej pozwolić wywołującemu to obsłużyć.
źródło
Jest to prawdopodobnie lepsze, gdy
a
staje się większeTo działa, ponieważ if
a[n:]
jest pustą listą ifn => len(a)
Oto przykład tego, jak to działa
range(5)
I pełen wyraz
źródło
next(iter(lst[i:i+1]), default)
- to kolejny wpis w tajemniczej, brzydkiej konkurencji jednokierunkowej.Właśnie odkryłem, że:
iter(l)
zwraca iterator włączonymyList
,next()
zużywa pierwszy element iteratora i zgłaszaStopIteration
błąd, chyba że wywołanie z wartością domyślną, co ma miejsce w tym przypadku, drugi argument,5
Działa to tylko wtedy, gdy potrzebujesz pierwszego elementu, co ma miejsce w twoim przykładzie, ale nie w tekście pytania, więc ...
Dodatkowo nie musi tworzyć tymczasowych list w pamięci i działa z każdym rodzajem iterowalnym, nawet jeśli nie ma nazwy (patrz komentarz Xionga Chiamiova do odpowiedzi gruszczy)
źródło
next(iter(myList[n:n+1]), 5)
Teraz działa dlan
tego elementu.try
Wariant nie jest jedno-liner (zapytaj zadawane przez OP). Działa tylko w przypadku list, ponieważmyList
jest to lista określona przez OP (dokładniej, jest to coś indeksowalnego). Tworzenie kopii w pamięci nie jest tutaj kosztowne, ponieważ tworzę tutaj listę jednego (lub żadnego) elementu. Jasne, trochę narzutów, ale nie warto o nich wspominać, chyba że robisz to miliony razy w pętli. Przy okazji, myślę, że tworzenie i przechwytywanieIndexError
wyjątku jest prawdopodobnie bardziej kosztowne.źródło
[] or ...
zrobiłem. Jednak osobiście po prostu skorzystałbym z przyjętego rozwiązania, ponieważ łatwo się czyta (dla nowicjuszy). To prawda, zawinięcie go w „def” z komentarzem sprawiłoby, że w dużej mierze nie byłby to problem.L[n] == False
lubL[n] == None
lubL[n] == []
bardziej globalnie cokolwiek, co ocenia się jako fałszywe?[False]
jest prawdziwy.myval = l[n:n+1] or [somedefault]
będzie działać dobrze?Istnieją przepisy itertools, które robią to dla ogólnych iterable. Dla wygody możesz
> pip install more_itertools
zaimportować tę bibliotekę innej firmy, która implementuje dla Ciebie takie przepisy:Kod
Szczegół
Oto realizacja
nth
przepisu:Na przykład
dict.get()
to narzędzie zwraca wartość domyślną dla brakujących indeksów. Dotyczy to ogólnych iterable:źródło
Tanim rozwiązaniem jest naprawdę nagranie z wyliczeniem i użyciem
.get()
jak zwykle, na przykładźródło
Łącząc @ Joachim z powyższym, możesz użyć
Przykłady:
A może bardziej przejrzyste, ale bez
len
źródło
Użycie Pythona 3.4
contextlib.suppress(exceptions)
do zbudowaniagetitem()
metody podobnej dogetattr()
.źródło