Während der Verarbeitung einer Liste mit map () möchte ich in Lambda auf den Index des Elements zugreifen. Wie kann ich das machen?
Zum Beispiel
ranked_users = ['jon','bob','jane','alice','chris']
user_details = map(lambda x: {'name':x, 'rank':?}, ranked_users)
Wie kann ich den Rang jedes Benutzers im obigen Beispiel ermitteln?
enumerate
erzeugt Tupel (ein einzelnes Objekt).lambda
s Tupel nicht wie Listenverständnisse entpacken.Alternativ können Sie ein Listenverständnis anstelle von map () und Lambda verwenden.
ranked_users = ['jon','bob','jane','alice','chris'] user_details = [{'name' : x, 'rank' : ranked_users.index(x)} for x in ranked_users]
Ausgabe:
[{'name': 'jon', 'rank': 0}, {'name': 'bob', 'rank': 1}, {'name': 'jane', 'rank': 2}, {'name': 'alice', 'rank': 3}, {'name': 'chris', 'rank': 4}]
Listenverständnisse sind sehr leistungsfähig und auch schneller als eine Kombination von
map
undlambda
.quelle
list.index()
ist nur angemessen, wenn alle Mitglieder vonranked_users
eindeutig sind. Gegebeneranked_users = ['chris','chris']
user_details
Ausgaben,[{'name': 'chris', 'rank': 0}, {'name': 'chris', 'rank': 0}]
wo es sein sollte[{'name': 'chris', 'rank': 0}, {'name': 'chris', 'rank': 1}]
.Meiner Meinung nach ging es um die Kartenfunktion, und die bevorzugte Antwort ist teilweise richtig, da Syntaxfehler durch das Setzen von Tupelargumenten auf Lambda verursacht wurden
lambda (i,x)
Idee der Aufzählung ist schön und richtige Lösung wäre:
map(lambda x: {'name':x[1], 'rank':x[0]}, enumerate(ranked_users))
und etwas Zeit, um Geschwindigkeit mit Verständnis zu vergleichen:
def with_map(): ranked_users = range(10 ** 6) list(map(lambda x: {'name': x[1], 'rank': x[0]}, enumerate(ranked_users))) def by_comprehension(): ranked_users = range(10 ** 6) [{'name': x, 'rank': i} for i, x in enumerate(ranked_users)] from timeit import timeit time_with_map = timeit(with_map, number=10) time_with_comprehension = timeit(by_comprehension, number=10) print('list comprehension is about %.2f x faster than map in this test case' % (time_with_map/time_with_comprehension))
Testergebnis: Das Listenverständnis ist in diesem Testfall etwa 1,31-mal schneller als die Karte
quelle
Tatsächlich ist hier eine elegantere, ausführlichere Lösung als die Verwendung eines Aufzählungstupels in der Karte (aufgrund der Tupelindizierung). Map kann mehr iterable als Argumente verwenden, also verwenden wir es.
map(lambda user, user_id: (user_id, user), ranked_users, range(ranked_users.__len__()))
quelle