Допустим, у нас есть функция add следующим образом
def add(x, y):
return x + y
мы хотим применить функцию карты для массива
map(add, [1, 2, 3], 2)
Семантика я хочу добавить 2 к каждому элементу массива. Но map
функция также требует списка в третьем аргументе.
Примечание: я добавляю пример добавления для простоты. Моя оригинальная функция намного сложнее. И, конечно, возможность установки значения по умолчанию для y
функции add не подлежит сомнению, так как она будет изменяться при каждом вызове.
map(add,[1,2,3],[2]*3)
в общем случаеmap
в качестве первого аргумента принимается функция, и если эта функция принимает аргумент K , вы должны использовать итеративный K :addTriple(a,b,c) -> map(addTriple,[...],[...],[...])
Ответы:
Одним из вариантов является понимание списка:
Больше вариантов:
источник
add()
это нетривиальная функцияmap()
не поможет в любом случае.map()
ведет себя какzip_longest()
в Python 2, в то время как он ведет себя какzip()
в Python 3.)Документы явно предполагают, что это основное использование для
itertools.repeat
:И нет никаких оснований для передачи
len([1,2,3])
в качествеtimes
аргумента;map
останавливается, как только первая итерация используется, поэтому бесконечная итерация вполне подходит:Фактически, это эквивалентно примеру для
repeat
в документах:Это создает хорошее решение для lazy-functions-language-y, которое также отлично читается в терминах Python-итераторов.
источник
def f(x,y,z): \\ return '.'.join([x,y,z])
и затем:list(map(f, list('abc'), repeat('foo'), list('defgh')))
возвращается['a.foo.d', 'b.foo.e', 'c.foo.f']
.repeat()
, поскольку онmap()
будет работать до тех пор, пока в этой версии Python не будет исчерпан самый длинный итератор, заполняяNone
все пропущенные значения. Сказать, что «нет причины» для передачи параметра, неправильно.Используйте понимание списка.
Если вы действительно , действительно , действительно хотите использовать
map
, дайте ему анонимную функцию в качестве первого аргумента:источник
Карта может содержать несколько аргументов, стандартным способом является
По вашему вопросу это должно быть
источник
Правильный ответ проще, чем вы думаете. Просто сделайте:
И изменить реализацию добавить, чтобы взять кортеж, т.е.
Это может обработать любой сложный случай использования, когда оба параметра добавления являются динамическими.
источник
Иногда я разрешал подобные ситуации (например, используя метод pandas.apply ), используя замыкания
Чтобы использовать их, вы определяете функцию, которая динамически определяет и возвращает обертку для вашей функции, эффективно превращая один из параметров в константу.
Что-то вроде этого:
Затем
add_constant(y)
возвращает функцию, которую можно использовать для добавленияy
к любому заданному значению:Что позволяет использовать его в любой ситуации, когда параметры задаются по одному:
редактировать
Если вы не хотите писать функцию замыкания где-то еще, у вас всегда есть возможность построить ее на лету с помощью лямбда-функции:
источник
Если у вас есть в наличии, я бы рассмотрел использование NumPy. Это очень быстро для этих типов операций:
Это предполагает, что ваше реальное приложение выполняет математические операции (которые могут быть векторизованы).
источник
Если вам действительно нужно использовать функцию карты (например, мое присвоение класса здесь ...), вы можете использовать функцию-оболочку с 1 аргументом, передавая остальную часть исходной в своем теле; т.е.
Грязный и уродливый, все еще делает трюк
источник
myFunc
нужноreturn Func(arg, extraArguments)
Func
это название вашей исходной функции - для OP туго было бы,add
напримерЯ считаю, что вам нужен starmap:
источник
Чтобы передать несколько аргументов в
map
функцию.Здесь q - это функция с несколькими аргументами, которую вызывает map () . Убедитесь, что длина обоих диапазонов, т.е.
источник
В :
nums = [1, 2, 3]
В :
map(add, nums, [2]*len(nums))
Вне:
[3, 4, 5]
источник
Вы можете включить лямбду вместе с картой:
источник
Оборачивая вызов функции лямбда-выражением и распаковывая звездочку, вы можете создать карту с произвольным числом аргументов.
источник
Другой вариант:
Этот формат очень полезен при вызове нескольких функций.
источник