我试图找出一种将元组列表拆分成对的方法。这应该适用于始终为偶数的列表。
我在如何做到这一点上画了一点空白,希望有人能指出我正确的方向。
data = [(1, 'name1'), (2, 'name2'), (3, 'name3'), (4, 'name4')]
最终应该是:
set1 = [(1, name1, 2, name2)]
set2 = [(3, name3, 4, name4)]
我怎样才能做到这一点?要阅读的文档等?
答案 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)]