Многократный кортеж в парный кортеж в Python? - PullRequest
11 голосов
/ 16 апреля 2009

Какой самый хороший способ разбить это:

tuple = ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h')

в это:

tuples = [('a', 'b'), ('c', 'd'), ('e', 'f'), ('g', 'h')]

Предполагая, что вход всегда имеет четное количество значений.

Ответы [ 5 ]

38 голосов
/ 16 апреля 2009

zip() ваш друг:

t = ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h')
zip(t[::2], t[1::2])
15 голосов
/ 16 апреля 2009
[(tuple[a], tuple[a+1]) for a in range(0,len(tuple),2)]
7 голосов
/ 16 апреля 2009

Или, используя itertools (см. Рецепт для grouper):

from itertools import izip
def group2(iterable):
   args = [iter(iterable)] * 2
   return izip(*args)

tuples = [ab for ab in group2(tuple)]
0 голосов
/ 27 июля 2013

Я представляю этот код на основе ответа Питера Хоффмана в качестве ответа на комментария dfa .

Гарантируется, что ваш кортеж имеет четное количество элементов или нет.

[(tup[i], tup[i+1]) for i in range(0, (len(tup)/2)*2, 2)]

Параметр диапазона (len(tup)/2)*2 вычисляет наибольшее четное число, меньшее или равное длине кортежа, поэтому гарантированно будет работать независимо от того, имеет ли кортеж четное число элементов.

Результатом метода будет список. Это можно преобразовать в кортежи с помощью функции tuple().

Пример:

def inPairs(tup):
    return [(tup[i], tup[i+1]) for i in range(0, (len(tup)/2)*2, 2)]

# odd number of elements
print("Odd Set")
odd = range(5)
print(odd)
po = inPairs(odd)
print(po)

# even number of elements
print("Even Set")
even = range(4)
print(even)
pe = inPairs(even)
print(pe)

выход

Odd Set
[0, 1, 2, 3, 4]
[(0, 1), (2, 3)]
Even Set
[0, 1, 2, 3]
[(0, 1), (2, 3)]
0 голосов
/ 16 апреля 2009

Вот общий рецепт для чанка любого размера, если он не всегда равен 2:

def chunk(seq, n):
    return [seq[i:i+n] for i in range(0, len(seq), n)]

chunks= chunk(tuples, 2)

Или, если вам нравятся итераторы:

def iterchunk(iterable, n):
    it= iter(iterable)
    while True:
        chunk= []
        try:
            for i in range(n):
                chunk.append(it.next())
        except StopIteration:
            break
        finally:
            if len(chunk)!=0:
                yield tuple(chunk)
...