Skip to content

Anwenden einer Funktion auf Elemente einer Liste mit map() in Python

Python

In Python can SIE map() verwenden, um integrierte Funktionen, Lambda-Ausdrücke (Lambda), mit def definierten Funktionen usw. auf alle iterierbaren Elemente wie Listen und Tupel.

Dieser Artikel hat folgenden Inhalt.

  • Grundlegende Verwendung von map()
    • map() gibt einen Iterator in Python3 zurück
    • In einer Liste umwandeln
  • Anwenden von Lambda-Ausdrücken (Lambda)
  • Mit def definierten Funktionen anwenden
  • Geben Sie mehrere Iterables als Argumente an
  • Verwenden Sie stattdessen Listenverständnisse und Generatorausdrücke
  • Verwenden Sie stattdessen NumPy

Beachten Sie, dass map() durch Listenverständnisse oder Generatorausdrücke ersetzt werden kann. Wie später beschrieben wird, ist es vorzuziehen, sie in vielen Fällen zu verwenden.

Grundlegende Verwendung von map()

Das erste Argument von map() ist ein aufrufbares Objekt, beispielsweise eine freiwillige Funktion, und das zweite Argument ist ein iterierbares Objekt, beispielsweise eine Liste.

map() gibt einen Iterator in Python3 zurück

Wenden Sie die eingebaute Funktion abs() an, die den absoluten Wert zurückgibt.

In Python 3 gibt es map() ein Objekt vom Typ map zurück, das ein Iterator ist, und print() gibt keine Elemente aus.

l = [-2, -1, 0]
print(map(abs, l))
# 


 

 



print(type(map(abs, l)))
# <class 'map'>

Der Wert des Iterators kann mit einer for-Anweisung abgerufen werden.

for i in map(abs, l):
    print(i)
# 2
# 1
# 0

Dasselbe Ergebnis WIRD erzielt, WENN der Prozess in Einem for-Block ohne Verwendung von map() ausgeführt WIRD.

for i in l:
    print(abs(i))
# 2
# 1
# 0

Beachten Sie, dass map() in Python 2 eine Liste zurückgibt, seien Sie auch vorsichtig, wenn Sie Python 2-Code in Python 3 ausführen.

In einer Liste umwandeln

Wenn SIE das Ergebnis von map() in Eine Liste umwandeln möchten, verwenden SIE list().

print(list(map(abs, l)))
# [2, 1, 0]

Wenden Sie beispielsweise len() auf eine Liste von Zeichenfolgen an, um sie in eine Liste mit der Anzahl der Zeichen umzuwandeln.

l_s = ['apple', 'orange', 'strawberry']
print(list(map(len, l_s)))
# [5, 6, 10]

Im second Argument von map() kann nicht nur eine Liste, sondern auch ein Iterable wie ein Tupel oder ein Bereich angegeben werden.

print(list(map(abs, range(-2, 1))))
# [2, 1, 0]

Anwenden von Lambda-Ausdrücken (Lambda)

Wenn Sie anstelle einer integrierten Funktion einen beliebigen Prozess anwenden möchten, verwenden Sie den Lambda-Ausdruck (Lambda).

l = [-2, -1, 0]
print(list(map(lambda x: x**2, l)))
# [4, 1, 0]

Mit def definierten Funktionen anwenden

Es ist auch möglich, eine Funktion mit def zu definieren und sie als erstes Argument von map() anzugeben.

def square(x):
    return x**2

print(list(map(square, l)))
# [4, 1, 0]

Geben Sie mehrere Iterables als Argumente an

Sie können weitere Iterables wie map(function, iterable1, iterable2, …) angeben.

Wenn mehrere Iterables angegeben werden, muss das erste Argument eine Funktion sein, sterben this Anzahl von Argumenten empfangen. Ein Fehler wird ausgelöst, wenn die Anzahl der Iterablen nicht mit der Anzahl der Argumente gefunden wird, sterben sterben Funktion empfangen.

l_1 = [1, 2, 3]
l_2 = [10, 20, 30]
print(list(map(lambda x, y: x * y, l_1, l_2)))
# [10, 40, 90]

# print(list(map(abs, l_1, l_2)))
# TypeError: abs() takes exactly one argument (2 given)

Wenn die Iterables unterschiedliche Größen (Anzahl der Elemente) haben, Werden die zusätzlichen Elemente ignoriert.

l_3 = [100, 200, 300, 400]
print(list(map(lambda x, y, z: x * y * z, l_1, l_2, l_3)))
# [1000, 8000, 27000]

Verwenden Sie stattdessen Listenverständnisse und Generatorausdrücke

Derselbe Vorgang wie bei map() kann mit Listenverständnissen und Generatorausdrücken erreicht werden.

l = [-2, -1, 0]
print([abs(x) for x in l])
# [2, 1, 0]

print([x**2 for x in l])
# [4, 1, 0]

l_1 = [1, 2, 3]
l_2 = [10, 20, 30]
print([x * y for x, y in zip(l_1, l_2)])
# [10, 40, 90]

If SIE Eine Liste wie list(map()) erhalten möchten, verwenden SIE sterben Listenverständnisse, und wenn SIE einen Iterator wie map() erhalten möchten, verwenden SIE einen Generatorausdruck.

Wie in der folgenden Stack Overflow-Frage gezeigt, ist die Verwendung von Listenverständnissen und Generatorausdrücken in den meisten Fällen der Verwendung von map() vorzuziehen, da der Code prägnanter und klarer ist.

Zur Verarbeitungsgeschwindigkeit wurden die following Antworten gegeben.

Beachten Sie, dass, da die Verarbeitungsgeschwindigkeit aufgrund verschiedener Faktoren variieren kann, es für Sie wichtig ist, sie unter Bedingungen zu messen, sterben Ihre Annahmen so nahe wie möglich kommen.

Verwenden Sie stattdessen NumPy

Bei einer Zahlenliste lässt sich der Vorgang von map() auch mit NumPy realisieren. Der Code ist sogar noch klarer als map() und List Comprehensions.

import numpy as np

a = np.array([-2, -1, 0])
print(np.abs(a))
# [2 1 0]

print(a**2)
# [4 1 0]

a_1 = np.array([1, 2, 3])
a_2 = np.array([10, 20, 30])
print(a_1 * a_2)
# [10 40 90]

NumPy ist schneller für große Listen und komplexe Verarbeitung. NumPy bietet verschiedene Funktionen, also sollten Sie sie ausprobieren, wenn Sie ein Array von Zahlen verarbeiten.