6
votes

Liste des Ints dans une liste de tuples Python

[1, 109, 2, 109, 2, 130, 2, 131, 2, 132, 3, 28, 3, 127] J'ai ce tableau et je veux le transformer en une liste de tuples, chaque tuple a 2 valeurs. La liste devient donc [(1, 109), (2, 109), (2, 130), (2, 131), (2, 132), (3, 28), (3, 127)]


2 commentaires

Connexe: Stackoverflow.com/questions/312443/...


Ce problème connexe consiste à générer une liste de listes , ce n'est donc pas un duplication exact, mais il est assez proche et facile à adapter


4 Réponses :


9
votes
>>> it = iter(L)
>>> zip(*[it]*2)
[(1, 109), (2, 109), (2, 130), (2, 131), (2, 132), (3, 28), (3, 127)]
Explanationit = iter(L) creates iterator on the initial list[it]*2 crates the list consisting of the same iterator twice.* used at the first place in the parameter is used to unpack the parameters, so that zip(*[it]*2) turns into zip(it,it). Though you can use zip(it,it), zip(*[it]*2) is a more general construction, which can be extended to any number of values in the resultant tuple.The core of this approach is that zip on each iteration tries to get one value from each argument. But it turns out that all the arguments are effectively the same iterator, so it yields every time a new value.

3 commentaires

Super-intelligent !! +1 pour ça. Mais celui qui tente de comprendre le code, y compris ces lignes, est pire.


@Niklasr Ouais, j'ai écrit des explications après avoir tapé le cœur de la réponse.


Il a l'air très bien, mais malheureusement, il s'appuie sur le fait que zip prend des valeurs des itérateurs de gauche à droite, ce qui peut être logique compte tenu de sa production, mais est en réalité un détail de mise en œuvre.



12
votes

Vous pouvez utiliser Zip combiné avec Tranchement pour créer un nouveau Liste de tuples . xxx

Cela générerait une nouvelle liste avec la sortie suivante xxx p> Le processus derrière cela est assez simple. Nous avons d'abord divisé la liste existante en deux nouvelles listes à l'aide de trancher . xxx

puis utilisez ZIP < / a> Pour combiner ces deux listes dans une liste de tuples. xxx


0 commentaires

2
votes

Une autre approche:

lst = [1, 109, 2, 109, 2, 130, 2, 131, 2, 132, 3, 28, 3, 127]

print [(lst[i], lst[i + 1]) for i in xrange(0, len(lst), 2)]
#[(1, 109), (2, 109), (2, 130), (2, 131), (2, 132), (3, 28), (3, 127)]


0 commentaires

0
votes

Inspiré de la réponse d'Ovgolovine:

>>> it=iter(L)
>>> [(next(it), el) for el in it]
[(109, 1), (109, 2), (130, 2), (131, 2), (132, 2), (28, 3), (127, 3)]


0 commentaires