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']

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']

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

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


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']

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ę

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)

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)))

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.


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

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 ().


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)))

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)

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']
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.