Todo programador necesita en algún momento alguna “tontada” como la de mezclar dos listas sin que se copien valores duplicados.
Hoy he necesitado hacer precisamente eso en Python y me he dicho a mi mismo, esto es una “tontada” y seguro que ya hay una forma trivial de hacerlo.
Cuando creemos que algo es trivial pero desconocemos como se hace, ¿qué es lo que hacemos?, pues si, recurrimos al tio Google para buscar y en mi caso he buscado “merge lists in python“
La búsqueda me ha arrojado un montón de resultados en infinidad de sitios, con debates interminables sobre cual es la mejor forma de hacer un “lists merge” en Python. Unos dicen que si hay que usar merge
de la librería heapq
:
from heapq import merge
list1 = ['a', 'b', 'c', 'd']
list2 = ['c', 'd', 'e', 'f']
my_cool_list = list(merge(list1, list2))
print my_cool_list
['a', 'b', 'c', 'd', 'c', 'd', 'e', 'f']
Después está el que opina que no, que lo que hay que hacer es usar el método
extend
del objeto list
:list1 = ['a', 'b', 'c', 'd']
list2 = ['c', 'd', 'e', 'f']
list2.extend(list1)
print list2
['a', 'b', 'c', 'd', 'c', 'd', 'e', 'f']
Después ya se pasa al sinsentido del flame sobre rendimiento de una u otra técnica y se pasa al uso de map
, set
y demás fauna con ejemplos poco claros, largos y costosos:
#Iterating over the list with a for statement
for i in a:
b.append(i)
#Copying the data using a list mapping
b = [k for k in a]
#Using the map function
map(lambda x: b.append(), a)
Y después de naufragar un buen rato por ahí me he decidido a pensar de modo pythonic durante un momento y he llegado a la siguiente pieza de código, elegante y sencilla para realizar justo lo que necesito:
list1 = ['a', 'b', 'c', 'd']
list2 = ['c', 'd', 'e', 'f']
# List merge without dupe
list1.extend([element for element in list2 if element not in list1])
print list1
['a', 'b', 'c', 'd', 'e', 'f']
Con esto he llegado a la conclusión de que en la mayoría de las ocasiones la solución más sencilla es la más adecuada y que a veces es más fácil pensar un poco y dejarse de ostias que recurrir siempre a Google.