Uwielbiam używać tego wyrażenia
if 'MICHAEL89' in USERNAMES:
...
gdzie USERNAMES
jest lista.
Czy istnieje sposób na dopasowanie elementów bez rozróżniania wielkości liter, czy też muszę użyć metody niestandardowej? Zastanawiam się tylko, czy istnieje potrzeba napisania dodatkowego kodu do tego.
python
string
list
case-insensitive
RadiantHex
źródło
źródło
if 'CaseFudge'.lower() in [x.lower() for x in list]
[...]
tworzy całą listę.(name.upper() for name in USERNAMES)
stworzyłby tylko generator i jeden potrzebny ciąg na raz - ogromne oszczędności pamięci, jeśli wykonujesz tę operację dużo. (jeszcze więcej oszczędności, jeśli po prostu utworzysz listę nazw użytkownikówZrobiłbym opakowanie , abyś mógł być nieinwazyjny. Minimalnie, na przykład ...:
Teraz
if CaseInsensitively('MICHAEL89') in whatever:
powinien zachowywać się zgodnie z wymaganiami (niezależnie od tego, czy prawa strona jest listą, dyktowaniem czy zestawem). (Osiągnięcie podobnych wyników przy włączaniu ciągów może wymagać więcej wysiłku, unikaj ostrzeżeń w niektórych przypadkachunicode
, itp.).źródło
CaseInsensitively('MICHAEL89') in {CaseInsensitively('Michael89'):True}
, żeby to zadziałało, co prawdopodobnie nie oznacza „zachowuj się zgodnie z wymaganiami”.etc.
i wymagającej więcej wysiłku części mojej odpowiedzi ;-).Zwykle (przynajmniej w sumie) kształtujesz obiekt tak, aby zachowywał się tak, jak chcesz.
name in USERNAMES
nie jest rozróżniana wielkość liter, dlategoUSERNAMES
należy zmienić:Wspaniałą rzeczą w tym jest to, że otwiera drogę do wielu ulepszeń, bez konieczności zmiany kodu poza klasą. Na przykład możesz zmienić
self.names
zestaw na zestaw w celu szybszego wyszukiwania lub obliczyć(n.lower() for n in self.names)
jedyny raz i zapisać go w klasie i tak dalej ...źródło
str.casefold
jest zalecany do dopasowywania ciągów bez uwzględniania wielkości liter. Rozwiązanie @nmichaels można w prosty sposób dostosować.Użyj:
Lub:
Zgodnie z dokumentacją :
źródło
Oto jeden sposób:
Aby to zadziałało, oba obiekty
string1
istring2
obiekty muszą być typustring
.źródło
Myślę, że musisz napisać dodatkowy kod. Na przykład:
W tym przypadku tworzymy nową listę ze wszystkimi wpisami w formacie
USERNAMES
zamienionymi na duże litery, a następnie porównujemy z tą nową listą.Aktualizacja
Jak mówi @viraptor , jeszcze lepiej jest użyć generatora zamiast
map
. Zobacz @Nathon „s odpowiedź .źródło
itertools
funkcjiimap
. Jest znacznie szybszy niż generator, ale spełnia ten sam cel.Mógłbyś
Aktualizacja: trochę się pobawiłem i myślę, że możesz uzyskać lepsze podejście do typu zwarcia przy użyciu
ifilter
Funkcja jest z itertools, jeden z moich ulubionych w obrębie modułów Pythona. Jest szybszy niż generator, ale po wywołaniu tworzy tylko następny element listy.źródło
Moje 5 (źle) centów
AKTUALIZACJA
Ouch, całkowicie się zgadzam @jpp, podam jako przykład złej praktyki :(
źródło
'a' in "".join(['AB']).lower()
zwroty,True
gdy nie tego chce OP.Potrzebowałem tego do słownika zamiast listy, rozwiązanie Jochena było najbardziej eleganckie w tym przypadku, więc trochę go zmodyfikowałem:
teraz możesz przekonwertować taki słownik
USERNAMESDICT = CaseInsensitiveDict(USERNAMESDICT)
i użyćif 'MICHAEL89' in USERNAMESDICT:
źródło
Aby mieć to w jednej linii, zrobiłem to:
Nie testowałem tego jednak pod względem czasu. Nie jestem pewien, jak szybko / wydajnie jest.
źródło