Konvertieren Sie eine Python-Liste mit allen Zeichenfolgen in Klein- oder Großbuchstaben

261

Ich habe eine Python-Listenvariable, die Zeichenfolgen enthält. Gibt es eine Python-Funktion, die alle Zeichenfolgen in einem Durchgang in Kleinbuchstaben und umgekehrt in Großbuchstaben konvertieren kann?

user219126
quelle
Warum "in einem Durchgang"? Erwägen Sie die Möglichkeit, dass mehrere Durchgänge erforderlich sind?
John Machin
Was muss die Ausgabe sein?
O.rka

Antworten:

440

Dies kann mit Listenverständnissen erfolgen. Diese haben grundsätzlich die Form von [function-of-item for item in some-list]. Um beispielsweise eine neue Liste zu erstellen, in der alle Elemente in Kleinbuchstaben (oder Großbuchstaben im zweiten Snippet) angeordnet sind, verwenden Sie Folgendes:

>>> [x.lower() for x in ["A","B","C"]]
['a', 'b', 'c']

>>> [x.upper() for x in ["a","b","c"]]
['A', 'B', 'C']

Sie können auch die mapFunktion verwenden:

>>> map(lambda x:x.lower(),["A","B","C"])
['a', 'b', 'c']
>>> map(lambda x:x.upper(),["a","b","c"])
['A', 'B', 'C']
SIE
quelle
12
Die Kartenfunktion funktioniert wie erwartet in Python2, jedoch müssen Sie in Python3 die Karte in eine Liste einschließen, z. B.:list(map(lambda x:x.upper(),["a","b","c"]))
Tom S
39
Der zweite Satz mit Karte ist richtig, aber verschwenderisch. Es macht keinen Sinn, eine Lambda-Funktion zu erstellen . Verwenden map(str.lower, ["A","B","C"])
Sie
1
Wenn ich nach diesem Aufruf versuche, eine Liste zu drucken, ändert sich nichts. Warum ist das so?
imitieren
1
@mimic Ein bisschen spät, aber für Leute, die darauf stoßen, war Ihr Problem wahrscheinlich, dass Sie das Ergebnis des Listenverständnisses nicht wieder Ihrer Liste zugewiesen haben. Wenn Sie nur das Listenverständnis ändern, wird der Wert zurückgegeben, aber nicht der Listenvariablen zugewiesen.
Michael Kolber
52

Listenverständnisse sind nicht nur leichter zu lesen (für viele Menschen), sondern gewinnen auch das Speed ​​Race:

$ 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
quelle
4
Kennen Sie den Grund, warum ein Listenverständnis schneller ist als eine Karte?
Nixuz
6
Es ist nicht immer schneller. Hier ist ein Beispiel, wo es nicht ist: stackoverflow.com/questions/1247486/… Aber es ist in diesem Fall nicht viel langsamer. Die Verwendung eines Lambda macht offensichtlich einen großen Unterschied. Es gibt weitere Beispiele dafür, warum es gefährlich ist, Ihrer Intuition bei Leistungsproblemen zu vertrauen, insbesondere in Python.
Ned Deily
3
in Python 3, mapgewinnt das Rennen, tut aber nichts :)
Jean-François Fabre
@NedDeily map(str.lower,["A","B","C"])ist am schnellsten ist python3.7.5
SHIVAM JINDAL
40
>>> map(str.lower,["A","B","C"])
['a', 'b', 'c']
Ghostdog74
quelle
offensichtlich str.upperin Großbuchstaben umzuwandeln
John La Rooy
20

Listenverständnis ist, wie ich es machen würde, es ist der "pythonische" Weg. Das folgende Transkript zeigt, wie eine Liste in Großbuchstaben und dann wieder in Kleinbuchstaben konvertiert wird:

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
quelle
2
äh, listals Variablenname zu verwenden ist nicht die beste Wahl :)
Jean-François Fabre
Nein, aber da der Name für die gezeigte Methode von geringer Bedeutung ist, ist er nicht wirklich relevant. Ich werde jedoch den Namen ändern, falls jemand den Code so verwenden möchte, wie er ist.
Paxdiablo
Die Magie des Stackoverflow: 250 Stimmen für eine Python 2-Lösung nur mit Lambda, wo es nicht sein sollte !! gut 249 jetzt
Jean-François Fabre
@ Jean-FrançoisFabre, ich bin mir nicht sicher, warum du denkst, dass dies eine reine Python-2-Lösung ist. Wie die Transkripte zeigen, läuft es eindeutig unter Python 3.5.2. Tatsächlich habe ich es gerade noch einmal zur Bestätigung überprüft . ... einige Zeit vergeht , während ich untersuchen ... Eigentlich egal, es scheint , dass Sie über die aktuelle akzeptierte Antwort sprachen eher als diese, so dass Sie wahrscheinlich zu kommentieren sollte es eher als hier. Kein Zweifel, ein ehrlicher Fehler. Prost.
Paxdiablo
1
Ja, ich habe deine nicht kritisiert (abgesehen von dem listZeug :)). Woher kommt deiner Meinung nach die UV-Strahlung, die du kürzlich bekommen hast? :)
Jean-François Fabre
7

Für dieses Beispiel ist das Verständnis am schnellsten

$ python -m timeit -s 's = ["eins", "zwei", "drei"] * 1000' '[x.upper für x in s]'
1000 Schleifen, am besten 3: 809 usec pro Schleife

$ python -m timeit -s 's = ["eins", "zwei", "drei"] * 1000' 'map (str.upper, s)'
1000 Schleifen, am besten 3: 1,12 ms pro Schleife

$ python -m timeit -s 's = ["eins", "zwei", "drei"] * 1000' 'map (lambda x: x.upper (), s)'
1000 Schleifen, am besten 3: 1,77 ms pro Schleife
John La Rooy
quelle
5

ein Schüler fragt, ein anderer Schüler mit dem gleichen Problem antwortet :))

fruits=['orange', 'grape', 'kiwi', 'apple', 'mango', 'fig', 'lemon']
newList = []
for fruit in fruits:
    newList.append(fruit.upper())
print(newList)
Cristina
quelle
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
quelle
2

Lösung:

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

Diese Lösung erstellt eine separate Liste mit Kleinbuchstaben, unabhängig von ihrer ursprünglichen Groß- und Kleinschreibung. Wenn der ursprüngliche Großbuchstabe list sgroß ist, enthält der Kleinbuchstabe des jeweiligen Elements in list p. Wenn die ursprüngliche Groß- und Kleinschreibung des Listenelements bereits in Kleinbuchstaben geschrieben list pist, list swird die Groß- und Kleinschreibung des Elements beibehalten und in Kleinbuchstaben gespeichert. Jetzt können Sie list sanstelle von verwenden list p.

Sunil
quelle
1

Wenn Sie mit einem anderen String übereinstimmen möchten, indem Sie ihn in einem Durchgang konvertieren, können Sie ihn auch verwenden str.casefold().

Dies ist nützlich, wenn Sie Nicht-ASCII-Zeichen haben und mit ASCII-Versionen übereinstimmen (z. B. maße vs masse). Obwohl str.loweroder str.upperin solchen Fällen fehlschlägt, str.casefold()wird bestanden. Dies ist in Python 3 verfügbar und die Idee wird ausführlich mit der Antwort https://stackoverflow.com/a/31599276/4848659 erläutert .

>>>str="Hello World";
>>>print(str.lower());
hello world
>>>print(str.upper());
HELLO WOLRD
>>>print(str.casefold());
hello world
Gimhani
quelle
1

Eine viel einfachere Version der Top-Antwort gibt hier @Amorpheuses.

Mit einer Liste von Werten in val:

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

Dies funktionierte gut für mich mit einer f = open () Textquelle.

Zeesy
quelle
1

Sie könnten versuchen, Folgendes zu verwenden:

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

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

print(list(map(capitalize_list, my_list)))
user10821509
quelle
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)

Wenn Sie eine Zeichenfolge oder Liste als Ausgabe und keinen Iterator benötigen (dies ist für Python3), vergleichen Sie die ''.join(string).upper()Option mit dieser:

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
quelle
0

Wenn Sie versuchen, alle Zeichenfolgen in Kleinbuchstaben in der Liste zu konvertieren, können Sie Pandas verwenden:

import pandas as pd

data = ['Study', 'Insights']

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

Ausgabe:

['study', 'insights']
Aaditya Ura
quelle