Pythonic способ разбивать числа, разделенные запятыми, на пары

Я хотел бы разделить значение, разделенное запятыми, на пары:

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

Что будет выглядеть что-то вроде pythonic ?

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

5 Solutions collect form web for “Pythonic способ разбивать числа, разделенные запятыми, на пары”

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

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

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

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

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

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

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

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

PS У меня этот код спрятался, и я только понял, откуда я его получил. В stackoverflow есть два очень похожих вопроса:

  • Каков самый «питонический» способ перебора списка в кусках?
  • Как вы разбиваете список на куски равномерного размера в Python?

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

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

Решение, подобное 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) 

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

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

 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.

  • Добавление двух кортежей в элемент
  • Преобразуйте цвет rgb в название имени на английском, например «зеленый»,
  • Написание списка кортежей в текстовый файл в Python
  • Как распаковать несколько кортежей в вызове функции
  • Разделение кортежей в Python - лучшая практика?
  • Вставьте одну символьную строку между значениями кортежа (Python)
  • Как искать список кортежей в Python
  • Query Python словарь для получения значения из кортежа
  • Python - лучший язык программирования в мире.