2015-03-18 2 views
0

Я пытаюсь найти способ разбить список кортежей на пары. Это должно работать для списка, который всегда имеет четное число.Разбиение списка кортежей

Я рисую немного пробела о том, как это сделать, и надеюсь, что кто-то может указать мне в правильном направлении.

data = [(1, 'name1'), (2, 'name2'), (3, 'name3'), (4, 'name4')] 

должен закончиться в чем-то вроде:

set1 = [(1, name1, 2, name2)] 
set2 = [(3, name3, 4, name4)] 

Любые советы о том, как я могу добиться этого? Документы для чтения или тому подобное?

Заранее спасибо

+0

Посмотрите на рецепт морской окунь на [itertools] (https: // docs.python.org/2/library/itertools.html). Может быть, объединить это с цепочкой. – kojiro

+1

Возможный дубликат [Как вы разбиваете список на куски равномерного размера в Python?] (Http://stackoverflow.com/questions/312443/how-do-you-split-a-list-into-evenly-sized- chunks-in-python) – squiguy

+1

Хм, вопрос о том, как разбить список на куски равномерного размера, будет обманом. Этот вопрос можно было бы решить, используя, частично, некоторые знания из этого другого вопроса, но это явно не обман. – kojiro

ответ

1

Простейшее было бы сделать итератор в списке, а пронестись что итератор с самим собой; затем суммируйте пары вместе в понимании списка.

>>> data = [(1, 'name1'), (2, 'name2'), (3, 'name3'), (4, 'name4')] 
>>> iterator = iter(data) 
>>> [ i + j for i, j in zip(iterator, iterator) ] 
[(1, 'name1', 2, 'name2'), (3, 'name3', 4, 'name4')] 

или как Oneliner

[ i + j for i, j in zip(*[iter(data)] * 2) ] 
+0

Последний ')' в задаче 'data' должен быть'] ', а oneliner нужно добавить'] 'в конец. Очень аккуратное решение. – TigerhawkT3

+0

Как я могу скопировать это из рабочего кода и в итоге: D Исправлено –

0

Использование itertools grouper рецепт:

import itertools 

def grouper(iterable, n, fillvalue=None): 
    groups = [iter(iterable)]*n 
    return itertools.zip_longest(*groups, fillvalue=fillvalue) 

и цепь их вместе.

data = [(1, 'name1'), (2, 'name2'), (3, 'name3'), (4, 'name4')] 
result = [tuple(itertools.chain.from_iterable(group)) for group in grouper(data, 2)] 

# result is: 

[(1, 'name1', 2, 'name2'), 
(3, 'name3', 4, 'name4')] 
0

Простое решение:

def split(tupls): 
if len(tupls) % 2 != 0: 
    print("list's length must be even") 
return [[tupls[2 * i][0], tupls[2 * i][1], tupls[2 * i + 1][0], tupls[2 * i + 1][1]] for i in range(len(tupls) // 2)] 
0

Чтобы разделить список на две просто получить половину пути в списке и использовать itertools.chain.from_iterable приковать элементы из каждой половины в один кортеж.

from itertools import chain, islice 

data = [(1, 'name1'), (2, 'name2'), (3, 'name3'), (4, 'name4')] 
half = len(data)//2 

set1 = [tuple(chain.from_iterable(islice(data, None, half)))] 
set2 = [tuple(chain.from_iterable(islice(data, half, None)))] 


print(set1) 
print(set2) 
[(1, 'name1', 2, 'name2')] 
[(3, 'name3', 4, 'name4')] 

Если вы хотите на самом деле нужен список пар, потому что ваши списки всегда даже вы можете использовать ИТЭР и дальше:

it = iter(data) 
pairs = [ele + next(it) for ele in it] 
0

Вы можете попробовать что-то вроде этого.

data = [(1, 'name1'), (2, 'name2'), (3, 'name3'), (4, 'name4')] #even number 
data = [data[i:i+2] for i in range(0, len(data), 2)] #where 2 is the number of tuples in the list 
print data 
data = [(1, 'name1'), (2, 'name2'), (3, 'name3'), (4, 'name4'), (5, 'name5')] 
data = [data[i:i+2] for i in range(0, len(data), 2)] #odd number 
print data 
0

вы можете попробовать этим:

middle = len(data)/2 
set1 = [tuple([data[i][j] for i in range(0,middle)for j in range(2)])] 
set2 = [tuple([data[i][j] for i in range(middle, len(data))for j in range(2)])] 
0
from itertools import chain 

data = [(1, 'name1'), (2, 'name2'), (3, 'name3'), (4, 'name4')] 

for i in range(0, len(data), 2): 
    pair = tuple(chain(*data[i:i+2])) 

или список один лайнер пар

pairs = [tuple(chain(*data[i:i+2])) for i in range(0, len(data), 2)] 
Смежные вопросы