Powiedzmy, że mamy funkcję add w następujący sposób
def add(x, y):
return x + y
chcemy zastosować funkcję mapy dla tablicy
map(add, [1, 2, 3], 2)
Semantyka jest taka, że chcę dodać 2 do każdego elementu tablicy. Ale map
funkcja wymaga również listy w trzecim argumencie.
Uwaga: dodaję przykład dla uproszczenia. Moja pierwotna funkcja jest znacznie bardziej skomplikowana. I oczywiście opcja ustawienia domyślnej wartości y
funkcji dodawania nie wchodzi w grę, ponieważ będzie ona zmieniana przy każdym wywołaniu.
map(add,[1,2,3],[2]*3)
generalniemap
przyjmuje funkcję jako pierwszy argument, a jeśli ta funkcja przyjmuje argument K , musisz kontynuować z K iterowalnym:addTriple(a,b,c) -> map(addTriple,[...],[...],[...])
Odpowiedzi:
Jedną z opcji jest zrozumienie listy:
Więcej możliwości:
źródło
add()
jest to nietrywialna funkcjamap()
żadnym wypadku nie pomoże.map()
zachowuje się jakzip_longest()
w Pythonie 2, podczas gdy zachowuje się jakzip()
w Pythonie 3.)Dokumenty wyraźnie sugerują, że jest to główne zastosowanie
itertools.repeat
:I nie ma powodu, aby przekazać
len([1,2,3])
jakotimes
argument;map
zatrzymuje się, gdy tylko zostanie zużyta pierwsza iterowalna, więc nieskończona iteracja jest całkowicie w porządku:W rzeczywistości jest to równoważne z przykładem
repeat
w dokumentach:To sprawia, że jest to przyjemne, leniwe, funkcjonalne rozwiązanie w języku y, które jest również doskonale czytelne pod względem iteratorów Pythona.
źródło
def f(x,y,z): \\ return '.'.join([x,y,z])
a potem:list(map(f, list('abc'), repeat('foo'), list('defgh')))
wraca['a.foo.d', 'b.foo.e', 'c.foo.f']
.repeat()
, ponieważmap()
będzie działać do wyczerpania najdłuższego iteratora w tej wersji Pythona, uzupełniającNone
wszystkie brakujące wartości. Mówienie, że „nie ma powodu”, aby przekazać parametr, jest błędne.Użyj rozumienia listy.
Jeśli naprawdę , naprawdę , naprawdę chcesz użyć
map
, daj mu anonimową funkcję jako pierwszy argument:źródło
Mapa może zawierać wiele argumentów, standardowym sposobem jest
W twoim pytaniu tak powinno być
źródło
Prawidłowa odpowiedź jest prostsza niż myślisz. Po prostu zrób:
I zmień implementację add, aby wziąć krotkę tj
Może to obsłużyć każdy skomplikowany przypadek użycia, w którym oba parametry dodawania są dynamiczne.
źródło
Czasami rozwiązywałem podobne sytuacje (np. Używając metody pandas.apply ) używając domknięć
Aby z nich skorzystać, definiujesz funkcję, która dynamicznie definiuje i zwraca opakowanie dla Twojej funkcji, skutecznie czyniąc jeden z parametrów stałą.
Coś takiego:
Następnie
add_constant(y)
zwraca funkcję, której można użyć do dodaniay
do dowolnej podanej wartości:Co pozwala na użycie go w każdej sytuacji, w której parametry podawane są pojedynczo:
edytować
Jeśli nie chcesz pisać funkcji zamknięcia w innym miejscu, zawsze masz możliwość zbudowania jej w locie za pomocą funkcji lambda:
źródło
Jeśli masz to dostępne, rozważyłbym użycie numpy. Jest bardzo szybki w przypadku tego typu operacji:
Zakłada się, że twoja prawdziwa aplikacja wykonuje operacje matematyczne (które można wektoryzować).
źródło
Jeśli naprawdę potrzebujesz użyć funkcji map (tak jak moje przypisanie klasy tutaj ...), możesz użyć funkcji opakowującej z 1 argumentem, przekazując resztę do oryginalnej w jej treści; tj .:
Brudny i brzydki, nadal działa
źródło
myFunc
musireturn Func(arg, extraArguments)
Func
to nazwa twojej pierwotnej funkcji - dla PO napięty byłobyadd
na przykładWierzę, że Starmap jest tym, czego potrzebujesz:
źródło
Przekazywanie wielu argumentów do
map
funkcji.Tutaj q jest funkcją z wieloma argumentami, którą wywołuje map () . Upewnij się, że długość obu zakresów tj
źródło
W :
nums = [1, 2, 3]
W :
map(add, nums, [2]*len(nums))
Na zewnątrz:
[3, 4, 5]
źródło
Możesz dołączyć lambdę wraz z mapą:
źródło
Zawijając wywołanie funkcji lambda i używając polecenia rozpakowywania gwiazdy, możesz wykonać mapowanie z dowolną liczbą argumentów.
źródło
Inną opcją jest:
Ten format jest bardzo przydatny podczas wywoływania wielu funkcji.
źródło