Pythonic способ разделить запятые числа в пары - PullRequest
17 голосов
/ 16 мая 2009

Я бы хотел разделить запятую на пары:

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

Как бы # что-то питоническое было бы похоже?

Как бы вы обнаружили и обработали строку с нечетным набором чисел?

Ответы [ 5 ]

44 голосов
/ 16 мая 2009

Что-то вроде:

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

Полный пример:

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

Если количество элементов нечетное, последний элемент будет игнорироваться. Будут включены только полные пары.

8 голосов
/ 16 мая 2009

Более общий вариант, который также работает на итераторах и позволяет комбинировать любое количество элементов:

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

Замените zip на itertools.izip, если хотите получить ленивый итератор вместо списка.

8 голосов
/ 16 мая 2009

Как насчет этого:

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

Это также хорошо обрабатывает неравные суммы:

>>> 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. Я спрятал этот код, и я только понял, откуда я его взял. По этому поводу в stackoverflow есть два очень похожих вопроса:

Также есть этот драгоценный камень из Рецептов раздела itertools:

def grouper(n, iterable, fillvalue=None):
    "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)
4 голосов
/ 16 сентября 2009

Решение, очень похожее на FogleBirds, но с использованием итератора (выражения генератора) вместо понимания списка.

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)

И списочные выражения, и выражения-генераторы, вероятно, будут считаться довольно "питоническими".

2 голосов
/ 16 мая 2009

Это будет игнорировать последнее число в нечетном списке:

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

Это добавит более короткий список к 0 в нечетном списке:

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

izip_longest доступен в Python 2.6.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...