2009-04-16 2 views
11

Какой самый хороший способ расщепления этого:Несколько кортежей для двухпартовых кортежей в Python?

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

в этом:

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

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

+7

Вы не можете переменной с именем кортежа перезаписывает встроенной функции кортеж(). – recursive

ответ

36

zip() ваш друг:

t = ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h') 
zip(t[::2], t[1::2]) 
+0

Хорошая альтернатива! –

+1

+1, потому что это довольно и я не знал о синтаксисе [::] –

+0

не работает для tuple = ('a', 'b', 'c', 'd', 'e', ​​'f ',' g ',' h ',' i ') # отметить последнее' i ', что делает кортежи нечетными длиной – dfa

15
[(tuple[a], tuple[a+1]) for a in range(0,len(tuple),2)] 
+0

+1 более явное использование функции диапазона –

-1

Вот общий рецепт для любого размера порции, если это не всегда может быть 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) 
+2

Я думаю, что вы имели в виду диапазон (0, len (seq), n), а не диапазон (0, len (seq)) – Noah

+0

-1: не работает. – nosklo

+0

Ной: та, действительно. – bobince

7

Или, мы ING itertools (см recipe для grouper):

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

tuples = [ab for ab in group2(tuple)] 
+0

+1: для упоминания документации (вы пришли первым :) – tzot

0

Я представляю этот код на основе Peter Hoffmann's answer в ответ на dfa's comment.

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

[(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)] 
Смежные вопросы