associação pythonbrasil[11] django zope/plone planet Início Logado como (Entrar)

Diferenças para "ProgramacaoFuncional"

Diferenças entre as versões de 2 e 3
Revisão 2e 2006-01-18 00:31:47
Tamanho: 1531
Editor: FabioCorrea
Comentário: Refactoring Wiki - eliminando pragma
Revisão 3e 2008-09-26 14:07:10
Tamanho: 1531
Editor: localhost
Comentário: converted to 1.6 markup
Nenhuma diferença encontrada!

Receita: Programação Funcional

Esta receita é fruto de uma dúvida de Idelmárcia, aqui na UFRN. Ela queria saber como fazer para criar uma lista que contivesse os elementos de uma lista de listas, pegando um elemento de cada sublista por vez. Por exemplo, para a lista 1, 2], [3], [4, 5, 6, o resultado seria: [1, 3, 4, 2, 5, 6].

Nós chegamos a um código utilizando generators recursivo, mas fiquei pensando e disse que poderia ser feito com apenas uma linha, daí fui montando minha idéia. O primeiro passo foi fazer um mapeamento, casando os elementos das sublistas que estão na mesma posição, ou None no caso de não haver um elemento para aquela posição.

>>> lista = [[1, 2], [3], [4, 5, 6]]
>>> map(None, *lista)
[(1, 3, 4), (2, None, 5), (None, None, 6)]

A lista já está na ordem que eu quero, tenho agora que quebrar as sublistas para ficar apenas com uma lista:

>>> reduce(lambda x, y: x + y, map(None, *lista))
(1, 3, 4, 2, None, 5, None, None, 6)

Agora ficou fácil, basta remover os 'None':

>>> filter(None, reduce(lambda x, y: x + y, map(None, *lista)))
(1, 3, 4, 2, 5, 6)

Pronto, tenho o resultado que desejava. A única diferença é que eu queria uma lista e o resultado foi uma tupla. Isto é facilmente resolvido usando 'list()':

>>> list(filter(None, reduce(lambda x, y: x + y, map(None, *lista))))
[1, 3, 4, 2, 5, 6]

Prontinho! Resolvido o problema.

Volta para CookBook.


João Paulo F Farias