Vamos dizer que temos uma função add da seguinte forma
def add(x, y):
return x + y
queremos aplicar a função de mapa para uma matriz
map(add, [1, 2, 3], 2)
A semântica é que eu quero adicionar 2 para todos os elementos da matriz. Mas a map
função também requer uma lista no terceiro argumento.
Nota: Estou colocando o exemplo add por simplicidade. Minha função original é muito mais complicada. E é claro que a opção de definir o valor padrão da y
função add está fora de questão, pois ela será alterada para cada chamada.
map(add,[1,2,3],[2]*3)
em geralmap
leva em uma função como seu primeiro argumento, e se esta função leva K argumento, você tem que acompanhar com K iterable:addTriple(a,b,c) -> map(addTriple,[...],[...],[...])
Respostas:
Uma opção é a compreensão da lista:
Mais opções:
fonte
add()
é uma função não-trivialmap()
não ajudará de qualquer maneira.map()
se comporta comozip_longest()
em Python 2, enquanto que ele se comporta comozip()
em Python 3.)Os documentos sugerem explicitamente que esse é o principal uso para
itertools.repeat
:E não há razão para passar
len([1,2,3])
comotimes
argumento;map
para assim que o primeiro iterável é consumido, portanto, um iterável infinito é perfeitamente adequado:De fato, isso é equivalente ao exemplo
repeat
dos documentos:Isso cria uma boa solução de linguagem funcional e preguiçosa que também é perfeitamente legível em termos de iterador Python.
fonte
def f(x,y,z): \\ return '.'.join([x,y,z])
e depois:list(map(f, list('abc'), repeat('foo'), list('defgh')))
retorna['a.foo.d', 'b.foo.e', 'c.foo.f']
.repeat()
, poismap()
será executado até que o iterador mais longo se esgote nessa versão do Python, preenchendoNone
todos os valores ausentes. Dizer que "não há razão" para passar o parâmetro está errado.Use uma lista de compreensão.
Se você realmente , realmente , realmente deseja usar
map
, dê a ela uma função anônima como o primeiro argumento:fonte
O mapa pode conter vários argumentos, a maneira padrão é
Na sua pergunta, deve ser
fonte
A resposta correta é mais simples do que você pensa. Simplesmente faça:
E mude a implementação de add para fazer uma tupla, ie
Isso pode lidar com qualquer caso de uso complicado em que ambos os parâmetros de adição sejam dinâmicos.
fonte
Às vezes, resolvia situações semelhantes (como usar o método pandas.apply ) usando closures
Para usá-los, você define uma função que define e retorna dinamicamente um wrapper para sua função, tornando efetivamente um dos parâmetros uma constante.
Algo assim:
Em seguida,
add_constant(y)
retorna uma função que pode ser usada para adicionary
a qualquer valor:O que permite usá-lo em qualquer situação em que os parâmetros sejam dados um de cada vez:
editar
Se você não quiser escrever a função de fechamento em outro lugar, sempre terá a possibilidade de construí-la em tempo real usando uma função lambda:
fonte
Se você tiver disponível, eu consideraria usar numpy. É muito rápido para esses tipos de operações:
Isso pressupõe que sua aplicação real esteja executando operações matemáticas (que podem ser vetorizadas).
fonte
Se você realmente precisa usar a função map (como minha tarefa de classe aqui ...), você pode usar uma função wrapper com 1 argumento, passando o restante para o original em seu corpo; ou seja:
Sujo e feio, ainda faz o truque
fonte
myFunc
precisareturn Func(arg, extraArguments)
Func
é o nome da sua função original - para apertado OP seriaadd
por exemploAcredito que starmap é o que você precisa:
fonte
Para passar vários argumentos para uma
map
função.Aqui q é função com múltiplos argumentos que map () chama. Verifique se o comprimento de ambos os intervalos
fonte
No :
nums = [1, 2, 3]
No :
map(add, nums, [2]*len(nums))
Fora:
[3, 4, 5]
fonte
Você pode incluir lambda junto com o mapa:
fonte
Envolvendo a chamada de função com um lambda e usando a descompactação em estrela, é possível mapear com número arbitrário de argumentos.
fonte
Outra opção é:
Este formato é muito útil ao chamar várias funções.
fonte