valores unicos una repetir repetidos quitar numeros lista eliminar elementos duplicados contar array python list list-comprehension suffix

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'']