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?

użytkownik219126
źródło
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']

Możesz także użyć mapfunkcji:

>>> map(lambda x:x.lower(),["A","B","C"])
['a', 'b', 'c']
>>> map(lambda x:x.upper(),["a","b","c"])
['A', 'B', 'C']
TY
źródło
12
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
Ned Deily
źródło
4
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
python3.5.5
40
>>> map(str.lower,["A","B","C"])
['a', 'b', 'c']
ghostdog74
źródło
oczywiście str.upperkonwertować na wielkie litery
John La Rooy,
20

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
Python 3.5.2 (default, Nov 17 2016, 17:05:23) 
[GCC 5.4.0 20160609] 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']
paxdiablo
źródło
2
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ę
John La Rooy
źródło
5

uczeń pyta, inny uczeń ma ten sam problem z odpowiedzią :))

fruits=['orange', 'grape', 'kiwi', 'apple', 'mango', 'fig', 'lemon']
newList = []
for fruit in fruits:
    newList.append(fruit.upper())
print(newList)
Cristina
źródło
3
mylist = ['Mixed Case One', 'Mixed Case Two', 'Mixed Three']
print(list(map(lambda x: x.lower(), mylist)))
print(list(map(lambda x: x.upper(), mylist)))
Chirael
źródło
2

Rozwiązanie:

>>> s = []
>>> p = ['This', 'That', 'There', 'is', 'apple']
>>> [s.append(i.lower()) if not 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.

Sunil
źródło
1

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
Gimhani
źródło
1

Podano tutaj znacznie prostszą wersję najważniejszej odpowiedzi @Amorpheuses.

Z listą wartości w val:

valsLower = [item.lower() for item in vals]

Działa to dla mnie dobrze ze źródłem tekstu f = open ().

Zeesy
źródło
1

Możesz spróbować użyć:

my_list = ['india', 'america', 'china', 'korea']

def capitalize_list(item):
    return item.upper()

print(list(map(capitalize_list, my_list)))
użytkownik10821509
źródło
0

Python3.6.8

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)
aerijman
źródło
0

Jeśli próbujesz przekonwertować cały ciąg znaków na małe litery na liście, możesz użyć pand:

import pandas as pd

data = ['Study', 'Insights']

pd_d = list(pd.Series(data).str.lower())

wynik:

['study', 'insights']
Aaditya Ura
źródło