6
votes

Obtenir une liste (sans liste imbriquée) directement à partir d'une compréhension de liste

Je veux retourner une liste avec les éléments entrelacés de deux listes directement à partir de la compréhension de la liste - sans utiliser une étape suivante pour aplatir le résultat. Est-ce possible?

alist1_temp=[1, 4,2]
alist2_temp=[3, 7,4]
t=[[x,y] for x,y in zip(alist1_temp, alist2_temp)]

Renvoyer [[1, 3], [4, 7], [2, 4]]

Mais comment puis-je obtenir directement de la liste-compréhension [1, 3, 4, 7, 2, 4] ?


0 commentaires

3 Réponses :


5
votes

Essayez ceci avec seulement zip pour l'obtenir dans l'ordre que vous voulez:

import itertools

list(itertools.chain(alist1_temp, alist2_temp))

si l'ordre ne vous dérange pas, faites simplement: p >

alist1_temp + alist2_temp

ou obtenez-le avec itertools.chain grâce à @buran:

[i for j in zip(alist1_temp, alist2_temp) for i in j]


3 commentaires

avec la chaîne - pourquoi pas simplement list (itertools.chain (alist1_temp, alist2_temp)) ? ce n'est pas de la compréhension, mais je ne suis pas sûr que la compréhension soit une exigence stricte. Et de toute façon l'ordre des éléments dans le résultat est différent.


@buran Bien, vous avez sûrement raison


@buran Edited, merci pour votre commentaire



1
votes

Si vous aimez la manière numpy de faire cela, vous pouvez utiliser ceci!

np.array(t).flatten()

ou vous pouvez également aplatir votre compréhension de liste

np.vstack((alist1_temp,alist2_temp)).flatten('F')


0 commentaires

1
votes

Comme vous avez spécifié que vous voulez l'obtenir à partir de la liste-compréhension:

alist1_temp=[1,4,2]
alist2_temp=[3,7,4]
L = len(alist1_temp)+len(alist2_temp)
t = [alist2_temp[i//2] if i%2 else alist1_temp[i//2] for i in range(L)]
print(t) #prints [1, 3, 4, 7, 2, 4]


0 commentaires