[pyar] Iterando sobre 2 listas

David Weil tenuki en gmail.com
Sab Abr 7 18:45:30 -03 2018


Hola Luis!

On 4/4/2018 5:06 PM, Luis Andraschnik wrote:
> Si tengo 2 listas de igual longitud y quiero recortar eliminando los 
> None y manteniendo la paridad de longitud
> tengo:
> foo=[1,2,3,4,5,6]
> bar=[100,200,300, None,None]
> y quiero esto:
> foo=[1,2,3]
> bar=[100,200,300]

> Se les ocurre alguna solución más pythónica, por ejemplo usando list 
> comprehensions?
> def emparejar(foo,bar):
>     foo1=[]
>     bar1=[]
>     for i, j in zip(foo,bar):
>         if j is not None:
>             foo1.append(i)
>             bar1.append(j)
>
>     return foo1, bar1

No me queda claro a partir del enunciado, que pasa si hay None en ambas 
listas y estan en distintas posiciones que deberia pasar, ej:
  [1,2,None,4,5] y ['a',None, 'c', 'd', 'e']  que deberia devolver?


( Y el codigo que pones tampoco quita ambiguedades ya que no considera 
Nones en la primer lista (cosa que si hace la otra solucion que te 
propusieron) )


Suponiendo que solamente filtras todas las posiciones que tienen None de 
los inputs, en cualquiera de los inputs fijtate, la mayor parte del 
trabajo la haces con zip(..) y como te mostraron se puede usar zip 
tambien para re-armar los datos, pero podes aprovechar y no limitarte a 
solamente dos listas de input:

def myfilter(*args):
     for elements in zip(*args):
         if not None in elements:
             yield elements


Fijate ademas que tambien se puede usar "in" para chequear por None en 
los elementos y entonces filtrar (evitandote escribir una condicion para 
cada una de las listas de input).

def main():
     print zip( *myfilter([1,2,3,4], 'abcd') )
     print zip( *myfilter([1,None,3,4], 'abcd') )
     print zip( *myfilter([1,None,3,4], [1,2,None, 4]) )

-> [(1, 2, 3, 4), ('a', 'b', 'c', 'd')]
-> [(1, 3, 4), ('a', 'c', 'd')]
-> [(1, 4), (1, 4)]

Saludos!


Más información sobre la lista de distribución pyar