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?
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']
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
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
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
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']
ä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
>>> 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']
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.
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
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)
Antworten:
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:Sie können auch die
map
Funktion verwenden:quelle
list(map(lambda x:x.upper(),["a","b","c"]))
map(str.lower, ["A","B","C"])
Listenverständnisse sind nicht nur leichter zu lesen (für viele Menschen), sondern gewinnen auch das Speed Race:
quelle
map
gewinnt das Rennen, tut aber nichts :)map(str.lower,["A","B","C"])
ist am schnellsten ist python3.7.5quelle
str.upper
in Großbuchstaben umzuwandelnListenverstä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:
quelle
list
als Variablenname zu verwenden ist nicht die beste Wahl :)list
Zeug :)). Woher kommt deiner Meinung nach die UV-Strahlung, die du kürzlich bekommen hast? :)Für dieses Beispiel ist das Verständnis am schnellsten
quelle
ein Schüler fragt, ein anderer Schüler mit dem gleichen Problem antwortet :))
quelle
quelle
Lösung:
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 s
groß ist, enthält der Kleinbuchstabe des jeweiligen Elements inlist p
. Wenn die ursprüngliche Groß- und Kleinschreibung des Listenelements bereits in Kleinbuchstaben geschriebenlist p
ist,list s
wird die Groß- und Kleinschreibung des Elements beibehalten und in Kleinbuchstaben gespeichert. Jetzt können Sielist s
anstelle von verwendenlist p
.quelle
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.lower
oderstr.upper
in 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 .quelle
Eine viel einfachere Version der Top-Antwort gibt hier @Amorpheuses.
Mit einer Liste von Werten in val:
Dies funktionierte gut für mich mit einer f = open () Textquelle.
quelle
Sie könnten versuchen, Folgendes zu verwenden:
quelle
Python3.6.8
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:quelle
Wenn Sie versuchen, alle Zeichenfolgen in Kleinbuchstaben in der Liste zu konvertieren, können Sie Pandas verwenden:
Ausgabe:
quelle