python - unicos - quitar elementos repetidos de una lista
Lista con valores duplicados y sufijo (6)
Tengo una lista, a
:
a = [''a'',''b'',''c'']
y necesita duplicar algunos valores con el sufijo _ind
agregado de esta manera (el orden es importante):
[''a'', ''a_ind'', ''b'', ''b_ind'', ''c'', ''c_ind'']
Lo intenté:
b = [[x, x + ''_ind''] for x in a]
c = [item for sublist in b for item in sublist]
print (c)
[''a'', ''a_ind'', ''b'', ''b_ind'', ''c'', ''c_ind'']
Creo que mi solución es un poco complicada. ¿Hay alguna solución mejor, más pythonic?
Antes de que la lista de comprensiones y generadores se inventaran / se extendieran, la gente solía pensar mucho más simple 1 :
>>> a = [''a'', ''b'', ''c'']
>>> b = []
>>> for x in a: b.extend([x, x+''_ind''])
...
>>> b
[''a'', ''a_ind'', ''b'', ''b_ind'', ''c'', ''c_ind'']
* No quiero decir que esas construcciones / herramientas son malas, solo quería señalar que hay una solución simple.
Como usted pidió "simple", pensé en pythonic
esto (aunque tal vez no de manera pythonic
):
for i in mylist:
mylist1.append(i);
mylist1.append(i + ''_ind'');
Otra alternativa con splicing (Python2.x, 3.x):
In [642]: result = [None] * len(a) * 2
In [643]: result[::2], result[1::2] = a, map(lambda x: x + ''_ind'', a)
In [644]: result
Out[644]: [''a'', ''a_ind'', ''b'', ''b_ind'', ''c'', ''c_ind'']
Podrías hacerlo un generador:
def mygen(lst):
for item in lst:
yield item
yield item + ''_ind''
>>> a = [''a'',''b'',''c'']
>>> list(mygen(a))
[''a'', ''a_ind'', ''b'', ''b_ind'', ''c'', ''c_ind'']
También podría hacerlo con itertools.product
, itertools.starmap
o itertools.chain
o comprensiones anidadas, pero en la mayoría de los casos preferiría una función de generador personalizada, simple de entender.
Puede acortarse un poco moviendo las opciones al ciclo for interno en la lista de comprensión:
a = [''a'',''b'',''c'']
[item for x in a for item in (x, x + ''_ind'')]
# [''a'', ''a_ind'', ''b'', ''b_ind'', ''c'', ''c_ind'']
Puedes usar itertools.chain()
:
import itertools
l = [''a'',''b'',''c'']
new_list = list(itertools.chain.from_iterable([[i, i+"_ind"] for i in l]))
print new_list
Salida:
[''a'', ''a_ind'', ''b'', ''b_ind'', ''c'', ''c_ind'']