Je veux convertir une liste comme cellecomment convertir la liste des int à la liste des tuples
l1 = [1,2,3,4,5,6,7,8]
à
l2 = [(1,2),(3,4),(5,6),(7,8)]
parce souhaitez boucler
for x,y in l2:
draw_thing(x,y)
Je veux convertir une liste comme cellecomment convertir la liste des int à la liste des tuples
l1 = [1,2,3,4,5,6,7,8]
à
l2 = [(1,2),(3,4),(5,6),(7,8)]
parce souhaitez boucler
for x,y in l2:
draw_thing(x,y)
Miser sur la réponse de Nick D':
>>> from itertools import izip
>>> t = [1,2,3,4,5,6,7,8,9,10,11,12]
>>> for a, b in izip(*[iter(t)]*2):
... print a, b
...
1 2
3 4
5 6
7 8
9 10
11 12
>>> for a, b, c in izip(*[iter(t)]*3):
... print a, b, c
...
1 2 3
4 5 6
7 8 9
10 11 12
>>> for a, b, c, d in izip(*[iter(t)]*4):
... print a, b, c, d
...
1 2 3 4
5 6 7 8
9 10 11 12
>>> for a, b, c, d, e, f in izip(*[iter(t)]*6):
... print a, b, c, d, e, f
...
1 2 3 4 5 6
7 8 9 10 11 12
>>>
Pas tout à fait aussi lisible, mais il montre une manière compacte pour obtenir une tuple de taille souhaitée.
Merci pour toutes les bonnes réponses! Itertools était nouveau pour moi. – lgwest
Quel est le problème avec juste accéder à l'index correct et incrémenter?
for (int i=0;i<myList.Length;i++)
{
draw_thing(myList[i],myList[++i]);
}
Oups - désolé, en mode C#. Je suis sûr que vous avez l'idée.
Vous pouvez faire:
l2 = []
for y in range(0, len(l1), 2):
l2.append((l1[y], l1[y+1]))
Je ne fais aucun contrôle pour vous assurer un même niveau 1 a donc nombre d'entrées et autres semblables.
Pas la plus élégante solution
l2 = [(l1[i], l1[i+1]) for i in xrange(0,len(l1),2)]
Une bonne façon est:
from itertools import izip
it = iter([1, 2, 3, 4])
for x, y in izip(it, it):
print x, y
Sortie:
1 2
3 4
>>>
Merde, ceci EST bon. – shylent
Jamais pensé à utiliser un seul itérateur deux fois pour compresser ... c'est luisant. Pour la touche finale, vous voudrez utiliser 'fromertools import izip' pour éviter de faire une copie supplémentaire. –
Encore un changement: 'zip (* [iter (the_list)] * 2)' (ou '* 3' pour 3-tuples, etc). –
Pas besoin de construire une nouvelle liste. Vous pouvez simplement itérer sur la liste par pas de 2 au lieu de 1. J'utilise len(L) - 1
comme limite supérieure afin de vous assurer que vous n'essayez pas d'accéder après la fin de la liste.
for i in range(0, len(L) - 1, 2):
draw_thing(L[i], L[i + 1])
Jetez un oeil à la fonction de groupeur de itertools docs.
from itertools import izip_longest
def grouper(n, iterable, fillvalue=None):
"grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
args = [iter(iterable)] * n
return izip_longest(fillvalue=fillvalue, *args)
Dans votre cas, l'utiliser comme ceci:
l1 = [1,2,3,4,5,6,7,8]
for (x, y) in grouper(2, l1):
draw_thing(x, y)
Essentiellement juste une version à long terme de ce que Steve Losh a écrit. – ephemient
Bien, je n'ai pas vu sa réponse. Mais ce n'est pas exactement pareil. Cette version peut être utile, lorsque la longueur de la liste n'est pas divisible par le nombre d'éléments que vous souhaitez traiter dans la boucle. –
+1 J'aime cette version, c'est plus clair, fonctionne avec d'autres longueurs comme vous l'avez dit, et est déjà sur les docs. – nosklo
Type de facile avec l'opérateur de découpage en tranches de python:
l2 = zip(l1[0::2], l1[1::2])
list = [1,2,3,4,5,6]
it = iter(list)
newlist = [(x, y) for x, y in zip(it, it)]
Vous parcourez (et décompressez) les tuples retournés par «zip» pour créer une liste de tuples identiques. En Python 2, la compréhension de la liste est superflue, et en Python 3 vous pouvez simplement appeler 'list'. – Stephan202
Cela revient beaucoup. Voici le cas plus général pour les groupes de N: http://stackoverflow.com/questions/1624883/alternative-way-to-split-a-list-into-groups-of-n/1625043#1625043 – u0b34a0f6ae