Konwertuj listę Python z ciągami znaków na małe lub wielkie litery
261
Mam zmienną listy python, która zawiera ciągi. Czy istnieje funkcja Pythona, która może konwertować wszystkie ciągi znaków w jednym przebiegu na małe i odwrotnie, wielkie litery?
Dlaczego „w jednym przejściu”? Czy zastanawiasz się nad możliwością wielokrotnego podania?
John Machin
Jaka powinna być wydajność?
O.rka
Odpowiedzi:
440
Można to zrobić za pomocą list. Zasadniczo mają one postać [function-of-item for item in some-list]. Na przykład, aby utworzyć nową listę, w której wszystkie elementy są pisane małymi literami (lub dużymi literami w drugim fragmencie), możesz użyć:
>>>[x.lower()for x in["A","B","C"]]['a','b','c']>>>[x.upper()for x in["a","b","c"]]['A','B','C']
Funkcja mapy działa zgodnie z oczekiwaniami w python2, jednak w python3 możesz zawinąć mapę w listę, np .:list(map(lambda x:x.upper(),["a","b","c"]))
Tom S
39
Druga propozycja z mapą jest poprawna, ale marnotrawna. Nie ma sensu tworzyć funkcji lambda . Po prostu użyjmap(str.lower, ["A","B","C"])
fralau,
1
Kiedy próbuję wydrukować listę po tym połączeniu, nic się nie zmienia. Dlaczego?
naśladują
1
@mimic Trochę za późno, ale dla osób, które się z tym zetknęły, zgaduję, że twój problem prawdopodobnie polegał na tym, że nie przypisałeś wyników analizy listy z powrotem do swojej listy. Samo zrozumienie listy zwraca wartość, ale nie przypisuje jej ponownie do zmiennej listy.
Michael Kolber,
52
Poza tym, że jest łatwiejszy do odczytania (dla wielu osób), wyliczenia list również wygrywają wyścig prędkości:
$ python2.6-m timeit '[x.lower() for x in ["A","B","C"]]'1000000 loops, best of 3:1.03 usec per loop
$ python2.6-m timeit '[x.upper() for x in ["a","b","c"]]'1000000 loops, best of 3:1.04 usec per loop
$ python2.6-m timeit 'map(str.lower,["A","B","C"])'1000000 loops, best of 3:1.44 usec per loop
$ python2.6-m timeit 'map(str.upper,["a","b","c"])'1000000 loops, best of 3:1.44 usec per loop
$ python2.6-m timeit 'map(lambda x:x.lower(),["A","B","C"])'1000000 loops, best of 3:1.87 usec per loop
$ python2.6-m timeit 'map(lambda x:x.upper(),["a","b","c"])'1000000 loops, best of 3:1.87 usec per loop
Czy znasz powód, dla którego zrozumienie listy jest szybsze niż mapa?
Nixuz,
6
Nie zawsze jest to szybsze. Oto przykład, w którym tak nie jest: stackoverflow.com/questions/1247486/... Ale w tym przypadku nie jest dużo wolniejszy. Korzystanie z lambda oczywiście robi dużą różnicę. Jest więcej przykładów, dlaczego ufanie intuicji w kwestiach wydajności jest niebezpieczne, szczególnie w Pythonie.
Ned Deily,
3
w python 3 mapwygrywa wyścig, ale nic nie robi :)
Jean-François Fabre
@NedDeily map(str.lower,["A","B","C"])jest najszybszy to
Zrozumienie listy jest tym, jak bym to zrobił, jest to sposób „pytonowy”. Poniższa transkrypcja pokazuje, jak przekonwertować listę na wielkie litery, a następnie z powrotem na małe:
pax@paxbox7:~$ python3
Python3.5.2(default,Nov172016,17:05:23)[GCC 5.4.020160609] on linux
Type"help","copyright","credits"or"license"for more information.>>> x =["one","two","three"]; x
['one','two','three']>>> x =[element.upper()for element in x]; x
['ONE','TWO','THREE']>>> x =[element.lower()for element in x]; x
['one','two','three']
err, używanie listjako nazwy zmiennej nie jest najlepszym wyborem :)
Jean-François Fabre
Nie, ale ponieważ nazwa ma niewielkie znaczenie dla wyświetlanej metody, nie jest tak naprawdę istotna. Jednak zmienię nazwę na wypadek, gdyby ktoś chciał użyć kodu w obecnej postaci.
paxdiablo
magia przepełnienia stosu: 250 głosów za rozwiązaniem opartym na pythonie 2 wykorzystującym lambda tam, gdzie nie powinno !! 249 teraz
Jean-François Fabre
@ Jean-FrançoisFabre, nie jestem pewien, dlaczego uważasz, że jest to rozwiązanie tylko dla języka Python-2. Jak pokazują transkrypty, wyraźnie działa pod Pythonem 3.5.2. W rzeczywistości sprawdziłem to jeszcze raz w celu potwierdzenia. ... minęło trochę czasu, kiedy prowadzę dochodzenie ... Właściwie nieważne, wygląda na to, że mówiłeś o aktualnie przyjętej odpowiedzi, a nie tej, więc prawdopodobnie powinieneś komentować tam, a nie tutaj. Bez wątpienia uczciwy błąd. Twoje zdrowie.
paxdiablo
1
tak, nie krytykowałem twojego (poza listrzeczami :)). Jak myślisz, skąd pochodzi promieniowanie UV, które ostatnio otrzymałeś? :)
Jean-François Fabre
7
Dla tej próbki zrozumienie jest najszybsze
$ python -m timeit -s 's = [„one”, „two”, „three”] * 1000' '[x.upper for x in s]'
1000 pętli, najlepiej 3: 809 usec na pętlę
$ python -m timeit -s 's = [„one”, „two”, „three”] * 1000' 'map (str.upper, s)'
1000 pętli, najlepiej 3: 1,12 ms na pętlę
$ python -m timeit -s 's = ["one", "two", "three"] * 1000' 'map (lambda x: x.upper (), s)'
1000 pętli, najlepiej 3: 1,77 ms na pętlę
>>> s =[]>>> p =['This','That','There','is','apple']>>>[s.append(i.lower())ifnot i.islower()else s.append(i)for i in p]>>> s
>>>['this','that','there','is','apple']
To rozwiązanie utworzy osobną listę zawierającą małe litery, niezależnie od ich oryginalnej wielkości. Jeśli oryginalne pudełko jest duże, wówczas list sbędzie zawierało małe litery odpowiedniego elementu w list p. Jeśli pierwotna wielkość elementu listy jest już pisana małymi literami, list pwówczas list szachowa wielkość litery elementu i będzie ją zapisywać małymi literami. Teraz możesz użyć list szamiast list p.
Jeśli Twoim celem jest dopasowanie z innym ciągiem poprzez konwersję w jednym przebiegu, możesz również użyć str.casefold().
Jest to przydatne, gdy masz znaki inne niż ascii i pasujące do wersji ascii (np .: maße vs masse). Chociaż przejdzie str.lowerlub str.uppernie, w takich przypadkach str.casefold()przejdzie. Jest to dostępne w Pythonie 3, a pomysł szczegółowo omówiono z odpowiedzią https://stackoverflow.com/a/31599276/4848659 .
>>>str="Hello World";>>>print(str.lower());
hello world
>>>print(str.upper());
HELLO WOLRD
>>>print(str.casefold());
hello world
In[1]: a ='which option is the fastest'In[2]:%%timeit
...:''.join(a).upper()762 ns ±11.4 ns per loop (mean ± std. dev. of 7 runs,1000000 loops each)In[3]:%%timeit
...: map(lambda x:x.upper(), a)209 ns ±5.73 ns per loop (mean ± std. dev. of 7 runs,1000000 loops each)In[4]:%%timeit
...: map(str.upper,[i for i in a])1.18µs ±11.3 ns per loop (mean ± std. dev. of 7 runs,1000000 loops each)In[5]:%%timeit
...:[i.upper()for i in a]3.2µs ±64.1 ns per loop (mean ± std. dev. of 7 runs,100000 loops each)
Jeśli potrzebujesz ciągu lub listy jako wyniku, a nie iteratora (dotyczy Python3), porównaj ''.join(string).upper()opcję z tym:
In[10]:%%timeit
...:[i for i in map(lambda x:x.upper(), a)]4.32µs ±112 ns per loop (mean ± std. dev. of 7 runs,100000 loops each)
Odpowiedzi:
Można to zrobić za pomocą list. Zasadniczo mają one postać
[function-of-item for item in some-list]
. Na przykład, aby utworzyć nową listę, w której wszystkie elementy są pisane małymi literami (lub dużymi literami w drugim fragmencie), możesz użyć:Możesz także użyć
map
funkcji:źródło
list(map(lambda x:x.upper(),["a","b","c"]))
map(str.lower, ["A","B","C"])
Poza tym, że jest łatwiejszy do odczytania (dla wielu osób), wyliczenia list również wygrywają wyścig prędkości:
źródło
map
wygrywa wyścig, ale nic nie robi :)map(str.lower,["A","B","C"])
jest najszybszy toźródło
str.upper
konwertować na wielkie literyZrozumienie listy jest tym, jak bym to zrobił, jest to sposób „pytonowy”. Poniższa transkrypcja pokazuje, jak przekonwertować listę na wielkie litery, a następnie z powrotem na małe:
źródło
list
jako nazwy zmiennej nie jest najlepszym wyborem :)list
rzeczami :)). Jak myślisz, skąd pochodzi promieniowanie UV, które ostatnio otrzymałeś? :)Dla tej próbki zrozumienie jest najszybsze
źródło
uczeń pyta, inny uczeń ma ten sam problem z odpowiedzią :))
źródło
źródło
Rozwiązanie:
To rozwiązanie utworzy osobną listę zawierającą małe litery, niezależnie od ich oryginalnej wielkości. Jeśli oryginalne pudełko jest duże, wówczas
list s
będzie zawierało małe litery odpowiedniego elementu wlist p
. Jeśli pierwotna wielkość elementu listy jest już pisana małymi literami,list p
wówczaslist s
zachowa wielkość litery elementu i będzie ją zapisywać małymi literami. Teraz możesz użyćlist s
zamiastlist p
.źródło
Jeśli Twoim celem jest dopasowanie z innym ciągiem poprzez konwersję w jednym przebiegu, możesz również użyć
str.casefold()
.Jest to przydatne, gdy masz znaki inne niż ascii i pasujące do wersji ascii (np .: maße vs masse). Chociaż przejdzie
str.lower
lubstr.upper
nie, w takich przypadkachstr.casefold()
przejdzie. Jest to dostępne w Pythonie 3, a pomysł szczegółowo omówiono z odpowiedzią https://stackoverflow.com/a/31599276/4848659 .źródło
Podano tutaj znacznie prostszą wersję najważniejszej odpowiedzi @Amorpheuses.
Z listą wartości w val:
Działa to dla mnie dobrze ze źródłem tekstu f = open ().
źródło
Możesz spróbować użyć:
źródło
Python3.6.8
Jeśli potrzebujesz ciągu lub listy jako wyniku, a nie iteratora (dotyczy Python3), porównaj
''.join(string).upper()
opcję z tym:źródło
Jeśli próbujesz przekonwertować cały ciąg znaków na małe litery na liście, możesz użyć pand:
wynik:
źródło