map(function, iterable, ...)
Aplique a função a todos os itens iteráveis e retorne uma lista dos resultados. Se argumentos iteráveis adicionais forem passados, a função deverá receber muitos argumentos e será aplicada aos itens de todos os iteráveis em paralelo.
Se um iterável for mais curto que outro, presume-se que seja estendido com nenhum item.
Se a função é None
, a função de identidade é assumida; se houver vários argumentos, map()
retornará uma lista que consiste em tuplas contendo os itens correspondentes de todas as iteráveis (um tipo de operação de transposição).
Os argumentos iteráveis podem ser uma sequência ou qualquer objeto iterável; o resultado é sempre uma lista.
Que papel isso desempenha na fabricação de um produto cartesiano?
content = map(tuple, array)
Qual o efeito de colocar uma tupla em qualquer lugar? Notei também que, sem a função map, a saída é abc
e com ela é a, b, c
.
Eu quero entender completamente essa função. As definições de referência também são difíceis de entender. Muito buço chique.
fonte
map
?map(None, a, b, c)
acontecezip(a, b, c)
. Mas você raramente vê isso na prática, precisamente porque azip
chamada é equivalente.tuple
é uma função (bem, é mais sutil do que isso, mas se comporta como uma função) que leva uma iterável e fornece uma tupla com os mesmos elementos - assimtuple([1, 2, 3])
é equivalente a(1, 2, 3)
. Poismap(tuple, array)
,array
seria uma iterável das iteráveis (pense em uma lista de listas) e devolve cada lista interna transformada em uma tupla.Respostas:
map
não é particularmente pitônico. Eu recomendaria usar a compreensão da lista:é basicamente equivalente a:
map
por si só, não pode produzir um produto cartesiano, porque o comprimento de sua lista de saída é sempre o mesmo que sua lista de entrada. Você pode fazer trivialmente um produto cartesiano com uma compreensão da lista:A sintaxe é um pouco confusa - isso é basicamente equivalente a:
fonte
map
muito menos detalhado do que a compreensão da lista, pelo menos no caso que você está demonstrando.map
equivalente de[v.__name__ for v in (object, str)]
?map(lambda v: v.__name__, list)
?map
era mais rápido que a compreensão, às vezes não, precisamente por causa da sobrecarga de chamada de função? Em particular, a heurística que aprendi é que, ao usar, é necessário introduzir uma chamada de função extra, as compreensões são mais rápidas? Por exemplo, fui levado a acreditar que é mais lento que , e até mais lento , justamente por causa da chamada de função adicional.map
map(lambda foo: foo.bar, my_list)
foo.bar for foo in my_list
map(operator.add, my_list_of_pairs)
x + y for x, y in my_list_of_pairs
map
não se relaciona com um produto cartesiano, embora eu imagine que alguém bem versado em programação funcional possa inventar uma maneira impossível de entender de gerar um usandomap
.map
no Python 3 é equivalente a isso:e a única diferença no Python 2 é que ele criará uma lista completa de resultados para retornar todos de uma vez em vez de
yield
ing.Embora a convenção Python geralmente prefira as compreensões de lista (ou expressões geradoras) para obter o mesmo resultado que uma chamada
map
, principalmente se você estiver usando uma expressão lambda como primeiro argumento:Como um exemplo do que você pediu nos comentários sobre a pergunta - "transforme uma string em uma matriz", por 'matriz', você provavelmente deseja uma tupla ou uma lista (ambas se comportam um pouco como matrizes de outros idiomas) -
Um uso
map
aqui seria se você começar com uma lista de cadeias em vez de uma única cadeia -map
pode listar todas elas individualmente:Observe que isso
map(list, a)
é equivalente no Python 2, mas no Python 3 você precisa dalist
chamada se quiser fazer algo diferente de alimentá-la em umfor
loop (ou em uma função de processamento como asum
que precisa apenas de uma iterável e não de uma sequência). Mas observe também que geralmente é preferível uma compreensão da lista:fonte
map
cria uma nova lista aplicando uma função a todos os elementos da fonte:n-ário
map
é equivalente a compactar iteráveis de entrada juntos e, em seguida, aplicar a função de transformação em todos os elementos dessa lista compactada intermediária. É não um produto cartesiano:Eu usei
zip
aqui, mas omap
comportamento realmente difere um pouco quando as iteráveis não são do mesmo tamanho - conforme observado na documentação, ele estende as iteráveis para conterNone
.fonte
[2,4,6]
para a compreensão lista e os loops explícitos, mas o mapa retorna um objeto mapa - por exemplo, fico com esta:<map at 0x123a49978>
Que eu, em seguida, deve coagir em uma lista.Simplificando um pouco, você pode imaginar
map()
fazer algo assim:Como você pode ver, ele pega uma função e uma lista e retorna uma nova lista com o resultado da aplicação da função a cada um dos elementos na lista de entrada. Eu disse "simplificando um pouco" porque, na realidade,
map()
pode processar mais de um iterável:Para a segunda parte da pergunta: que papel isso desempenha na fabricação de um produto cartesiano? bem,
map()
poderia ser usado para gerar o produto cartesiano de uma lista como esta:... Mas, para dizer a verdade, usar
product()
é uma maneira muito mais simples e natural de resolver o problema:De qualquer maneira, o resultado é o produto cartesiano
lst
conforme definido acima:fonte
A
map()
função existe para aplicar o mesmo procedimento a todos os itens em uma estrutura de dados iterável, como listas, geradores, seqüências de caracteres e outras coisas.Vejamos um exemplo:
map()
pode percorrer todos os itens de uma lista e aplicar uma função a cada item, para que retorne (devolva) a nova lista.Imagine que você tem uma função que pega um número, adiciona 1 a esse número e a retorna:
Você também tem uma lista de números:
se você quiser incrementar todos os números da lista, faça o seguinte:
Nota: No mínimo,
map()
precisa de dois argumentos. Primeiro o nome de uma função e depois algo como uma lista.Vamos ver outras coisas legais que
map()
podemos fazer.map()
pode pegar vários iterables (listas, seqüências de caracteres etc.) e passar um elemento de cada iterável para uma função como argumento.Temos três listas:
map()
pode fazer de você uma nova lista que contém a adição de elementos em um índice específico.Agora lembre-se
map()
, precisa de uma função. Desta vez, usaremos asum()
função incorporada. A corridamap()
fornece o seguinte resultado:LEMBRE-SE:
No Python 2
map()
, iterará (percorrerá os elementos das listas) de acordo com a lista mais longa e passaráNone
para a função pelas listas mais curtas; portanto, sua função deve procurarNone
las e manipulá-las, caso contrário, ocorrerá erros. Em Python 3map()
irá parar após terminar com a lista mais curta. Além disso, no Python 3,map()
retorna um iterador, não uma lista.fonte
Python3 - mapa (func, iterável)
Uma coisa que não foi mencionada completamente (embora o @BlooB tenha mencionado isso) é que o mapa retorna um objeto de mapa, NÃO uma lista. Essa é uma grande diferença quando se trata de desempenho de tempo na inicialização e iteração. Considere estes dois testes.
Como você pode ver, a inicialização da função de mapa quase não leva tempo. No entanto, a iteração no objeto de mapa leva mais tempo do que simplesmente na iterável. Isso significa que a função passada para map () não é aplicada a cada elemento até que o elemento seja atingido na iteração. Se você deseja uma lista, use a compreensão da lista. Se você planeja iterar em um loop for e interromper em algum momento, use map.
fonte