拆分元组列表

时间:2015-03-18 18:41:25

标签: python

我试图找出一种将元组列表拆分成对的方法。这应该适用于始终为偶数的列表。

我在如何做到这一点上画了一点空白,希望有人能指出我正确的方向。

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

最终应该是:

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

我怎样才能做到这一点?要阅读的文档等?

7 个答案:

答案 0 :(得分: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) ]

答案 1 :(得分: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')]

答案 2 :(得分: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)]

答案 3 :(得分: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')]

如果你真的想要一个对列表,因为你的列表总是偶数你可以使用iter和next:

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

答案 4 :(得分: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

答案 5 :(得分: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)])]

答案 6 :(得分: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)]