web-dev-qa-db-fra.com

Liste avec valeurs et suffixes dupliqués

J'ai une liste, a:

a = ['a','b','c']

et devez dupliquer certaines valeurs avec le suffixe _ind ajouté de cette façon (l'ordre est important):

['a', 'a_ind', 'b', 'b_ind', 'c', 'c_ind']

J'ai essayé:

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

Je pense que ma solution est un peu trop compliquée. Y a-t-il une meilleure solution, plus Pythonic?

46
jezrael

Vous pourriez en faire un générateur:

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

Vous pouvez également le faire avec itertools.product, itertools.starmap ou itertools.chain ou compréhensions imbriquées, mais dans la plupart des cas, je préférerais une fonction de générateur personnalisée simple à comprendre.


Avec python3.3, vous pouvez également utiliser yield from— délégation de générateur - pour rendre cette solution élégante un peu plus concise:

def mygen(lst):
    for item in lst:
        yield from (item, item + '_ind')
60
MSeifert

Il peut être raccourci un peu en déplaçant les options vers la boucle for interne dans la compréhension de la liste:

a = ['a','b','c']

[item for x in a for item in (x, x + '_ind')]
# ['a', 'a_ind', 'b', 'b_ind', 'c', 'c_ind']
26
Psidom

Une autre alternative avec l'épissage (Python2.x, 3.x):

result = [None] * len(a) * 2
result[::2], result[1::2] = a, map(lambda x: x + '_ind', a)

result
# ['a', 'a_ind', 'b', 'b_ind', 'c', 'c_ind']
16
cs95

Vous pouvez utiliser 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

Production:

['a', 'a_ind', 'b', 'b_ind', 'c', 'c_ind']
7
Ajax1234

Puisque vous avez demandé "simple", j'ai pensé que je lancerais ceci (quoique, peut-être pas de la manière Pythonic):

for i in mylist: 
    mylist1.append(i);
    mylist1.append(i + '_ind');
5
Eladian

Avant que les compréhensions de listes et les générateurs ne soient inventés/généralisés, les gens pensaient beaucoup plus simplement1:

>>> a = ['a', 'b', 'c']
>>> b = []
>>> for x in a: b.extend([x, x+'_ind'])
... 
>>> b
['a', 'a_ind', 'b', 'b_ind', 'c', 'c_ind']

* Je ne veux pas dire que ces constructions/outils sont mauvais, je voulais juste souligner qu'il existe une solution simple.

5
Leon