2010-07-30 5 views
0

Je dois faire un tuple de liste avec 2 items.Tâche logique pour les programmeurs Python. Faire un tuple de listes de la liste

Par exemple, si je liste range(10)

je dois faire tuple comme ceci:

[(0,1),(2,3),(4,5),(6,7),(8,9)] 

Comment puis-je mettre en œuvre cela?

+0

double possible (http://stackoverflow.com/questions/756550/multiple-tuple-to -two-pair-tuple-in-python) –

+0

dupliquer: http://stackoverflow.com/questions/870652/pythonic-way-to-split-comma-separated-numbers-into-pairs/870677#870677 – FogleBird

+0

copie possible de [Comment diviser une liste en morceaux de taille égale en Python?] (http://stackoverflow.com/questions/312443/how-do-you-split-a-list-into-evenly-sized-chunks-in -python) – tzot

Répondre

2

Voir la grouper recipe des 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) 

Cela signifie que vous pouvez faire:

[(el[0], el[1]) for el in grouper(2, range(10))] 

Ou plus généralement:

[(el[0], el[1]) for el in grouper(2, elements)] 
+2

J'écrirais la liste (grouper (2, range (10))) –

+0

Nice! Je m'en souviendrai. –

3

De nombreuses façons différentes. Juste pour montrer quelques:

Comme la compréhension de la liste, où l est une séquence (ie index entier): [(l[i], l[i+1]) for i in range(0,len(l),2)]

En fonction de générateur, fonctionne pour tous iterables:

def some_meaningful_name(it): 
    it = iter(it) 
    while True: 
     yield next(it), next(it) 

Naive via la liste tranchage (performance sucksy pour les listes plus grandes) et la copie, à nouveau en utilisant la compréhension de la liste: [pair for pair in zip(l[::2],l[1::2])]. J'aime le deuxième meilleur, et c'est probablement le plus générique et pythonique (et puisqu'il s'agit d'un générateur, il fonctionne dans un espace constant).

0

peut également être fait avec numpy: [? Multiple Tuple à deux paires Tuple en Python]

import numpy 
elements = range(10) 

elements = [tuple(e) for e in numpy.array(elements).reshape(-1,2).tolist()] 
# [(0, 1), (2, 3), (4, 5), (6, 7), (8, 9)] 
Questions connexes