2009-10-29 3 views
4

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) 
+1

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

Répondre

7

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.

+1

Merci pour toutes les bonnes réponses! Itertools était nouveau pour moi. – lgwest

-3

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.

+0

Il a demandé la répondre en Python: P – Dana

+0

Mon mauvais. Eh bien, l'idée est claire, j'espère. –

+2

ne saviez-vous pas? tout en python doit être en 1 ligne. même si cette ligne est longue de 300 caractères – Shawn

0

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.

0

Pas la plus élégante solution

l2 = [(l1[i], l1[i+1]) for i in xrange(0,len(l1),2)] 
10

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 
>>> 
+0

Merde, ceci EST bon. – shylent

+3

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. –

+4

Encore un changement: 'zip (* [iter (the_list)] * 2)' (ou '* 3' pour 3-tuples, etc). –

0

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]) 
2

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) 
+1

Essentiellement juste une version à long terme de ce que Steve Losh a écrit. – ephemient

+1

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. –

+0

+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

5

Type de facile avec l'opérateur de découpage en tranches de python:

l2 = zip(l1[0::2], l1[1::2]) 
0
list = [1,2,3,4,5,6] 
it = iter(list) 
newlist = [(x, y) for x, y in zip(it, it)] 
+0

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

Questions connexes