Wenden Sie die Funktion auf jedes Element einer Liste an

75

Wie wende ich eine Funktion auf die Liste der Variableneingaben an? Zum Beispiel gibt die filterFunktion wahre Werte zurück, aber nicht die tatsächliche Ausgabe der Funktion.

from string import upper
mylis=['this is test', 'another test']

filter(upper, mylis)
['this is test', 'another test']

Die erwartete Ausgabe ist:

['THIS IS TEST', 'ANOTHER TEST']

Ich weiß, upperist eingebaut. Dies ist nur ein Beispiel.

Shantanuo
quelle

Antworten:

98

Ich denke du willst verwenden mapstatt filter:

>>> from string import upper
>>> mylis=['this is test', 'another test']
>>> map(upper, mylis)
['THIS IS TEST', 'ANOTHER TEST']

Noch einfacher können Sie verwenden, str.upperanstatt zu importieren string(dank @alecxe):

>>> map(str.upper, mylis)
['THIS IS TEST', 'ANOTHER TEST']

Erstellt in Python 2.x mapeine neue Liste, indem auf jedes Element in einer Liste eine bestimmte Funktion angewendet wird. filterErstellt eine neue Liste, indem sie sich auf Elemente beschränkt, die Truemit einer bestimmten Funktion ausgewertet werden.

In Python 3.x mapund filterKonstrukt Iteratoren statt Listen, also wenn Sie Python 3.x verwenden und benötigen eine Liste der Liste Verständnis Ansatz wäre besser geeignet.

mdml
quelle
3
map(str.upper, mylis)würde auch funktionieren, würde helfen, einen stringImport zu vermeiden .
Alecxe
4
Beachten Sie, dass mapnur ein liston python2.x erstellt wird - In python3.x wird ein Iterator zurückgegeben. Häufig spielt das keine Rolle, aber wenn Sie eine Liste als Ausgabe benötigen , ist es wahrscheinlich besser, ein Listenverständnis wie in der anderen Antwort zu verwenden.
mgilson
1
Ist der Ansatz für Nebenwirkungen gleich?
Ivan Balashov
6
In Python 3.x können Sie dies tun list(map(str.upper, mylis)), wenn Sie eine Liste wünschen .
BlueManCZ
90

Alternativ können Sie einen list comprehensionAnsatz wählen:

>>> mylis = ['this is test', 'another test']
>>> [item.upper() for item in mylis]
['THIS IS TEST', 'ANOTHER TEST']
Alecxe
quelle
2
Persönlich bevorzuge ich das sehr. Also Python.
OJFord
2
Wäre das Durchlaufen einer Liste nicht viel langsamer?
John Ktejik
Wenn Sie eine Liste als Ausgabe wünschen, dann funktioniert dies definitiv besser als alles andere
Mr. Suryaa Jha
3
Um eine Liste vom funktionalen Ansatz zu erhalten, kehren Sie zurücklist(map(str.upper, mylist))
Pablo Adames
5
So etwas wäre sehr praktisch: mylist = mylist.apply (lambda x: x.upper ()); F # -ish Ansatz, sehr kompakt und leicht zu lesen; Soweit ich weiß, gibt es derzeit keine solche Struktur, aber möglicherweise in der Zukunft Pythons?
OverInflatedWalrus
0

Manchmal müssen Sie eine Funktion auf die vorhandenen Mitglieder einer Liste anwenden. Der folgende Code hat bei mir funktioniert:

>>> def func(a, i):
...     a[i] = a[i].lower()
>>> a = ['TEST', 'TEXT']
>>> list(map(lambda i:func(a, i), range(0, len(a))))
[None, None]
>>> print(a)
['test', 'text']

Bitte beachten Sie, dass die Ausgabe von map () an den Listenkonstruktor übergeben wird , um sicherzustellen, dass die Liste in Python 3 konvertiert wird. Die mit None- Werten gefüllte zurückgegebene Liste sollte ignoriert werden, da unser Zweck darin bestand, Liste a an Ort und Stelle zu konvertieren

efimp
quelle