2009-05-15 17 views
17

que me gustaría dividir un valor separado por comas en parejas:manera Pythonic para dividir números separados por comas en parejas

>>> s = '0,1,2,3,4,5,6,7,8,9' 
>>> pairs = # something pythonic 
>>> pairs 
[(0, 1), (2, 3), (4, 5), (6, 7), (8, 9)] 

¿Cómo sería algo # Pythonic parece?

¿Cómo detectaría y manejaría una cuerda con un conjunto impar de números?

+0

posible duplicado de [¿Cómo se divide una lista en trozos de tamaño uniforme en Python?] (Http://stackoverflow.com/questions/312443/how-do-you-split-a-list-into-evenly- sized-chunks-in-python) – tzot

Respuesta

44

Algo así como:

zip(t[::2], t[1::2]) 

ejemplo completo:

>>> s = ','.join(str(i) for i in range(10)) 
>>> s 
'0,1,2,3,4,5,6,7,8,9' 
>>> t = [int(i) for i in s.split(',')] 
>>> t 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
>>> p = zip(t[::2], t[1::2]) 
>>> p 
[(0, 1), (2, 3), (4, 5), (6, 7), (8, 9)] 
>>> 

Si el número de elementos es impar, se tendrá en cuenta el último elemento. Solo se incluirán pares completos.

+13

Dios me encanta Python ... – 0x6adb015

8

¿Qué tal esto:

>>> x = '0,1,2,3,4,5,6,7,8,9'.split(',') 
>>> def chunker(seq, size): 
...  return (tuple(seq[pos:pos + size]) for pos in xrange(0, len(seq), size)) 
... 
>>> list(chunker(x, 2)) 
[('0', '1'), ('2', '3'), ('4', '5'), ('6', '7'), ('8', '9')] 

Esto también manejar muy bien las cantidades desiguales:

>>> x = '0,1,2,3,4,5,6,7,8,9,10'.split(',') 
>>> list(chunker(x, 2)) 
[('0', '1'), ('2', '3'), ('4', '5'), ('6', '7'), ('8', '9'), ('10',)] 

P. S. Tenía este código escondido y me di cuenta de dónde lo había sacado. Hay dos preguntas muy similares en stackoverflow sobre este:

También hay esta joya de la sección Recipes de itertools:

def grouper(n, iterable, fillvalue=None): 
    "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx" 
    args = [iter(iterable)] * n 
    return izip_longest(fillvalue=fillvalue, *args) 
+0

No pensé en buscar el fragmento – jsamsa

2

Esto hará caso omiso de la última número en una lista impar:

n = [int(x) for x in s.split(',')] 
print zip(n[::2], n[1::2]) 

almohadilla Esta voluntad la lista más corta por 0 en una lista impar:

import itertools 
n = [int(x) for x in s.split(',')] 
print list(itertools.izip_longest(n[::2], n[1::2], fillvalue=0)) 

izip_longest está disponible en Python 2.6.

+0

o con el "tullido" Python 2.5: si len (r)% 2: r.append (0) –

8

Una opción más general, que también trabaja en iteradores y permite combinar cualquier número de elementos:

def n_wise(seq, n): 
    return zip(*([iter(seq)]*n)) 

Reemplazar zip con itertools.izip si usted desea conseguir un iterador perezoso en lugar de una lista.

+1

esto lleva críptico al siguiente nivel – YGA

+0

Esp. la duplicación de la parte del iterador. ;-) Genial, sin embargo. – Plumenator

4

Solución similar a FogleBirds, pero utilizando un iterador (una expresión de generador) en lugar de una lista de comprensión.

s = '0,1,2,3,4,5,6,7,8,9' 
# generator expression creating an iterator yielding numbers 
iterator = (int(i) for i in s.split(',')) 

# use zip to create pairs 
# (will ignore last item if odd number of items) 
# Note that zip() returns a list in Python 2.x, 
# in Python 3 it returns an iterator 
pairs = zip(iterator, iterator) 

Tanto las listas de comprensión como las expresiones del generador probablemente se considerarían bastante "pitónicas".

+1

Éste ayuda a comprender el código de Ants Aasma. – Plumenator

Cuestiones relacionadas