Python元组重组

时间:2018-10-03 18:10:45

标签: python tuples

我是python的新手,目前正努力以我想要的方式返回元组列表。

如果我有一个看起来像元组的列表

  [('a',),('b',),('c',),('d',),('e',),('f',)]

如何将其更改为

  [('a','b'),('c','d'),('e','f')]

  [('a','b','c'),('d','e'),('f',)] ?

是否有一种简单的方法来重组元组?

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

对于内部元组的一致长度,您可以通过itertools.chain展平元组列表,然后定义分块生成器:

from itertools import chain

L = [('a',),('b',),('c',),('d',),('e',),('f',)]

def chunker(L, n):
    T = tuple(chain.from_iterable(L))
    for i in range(0, len(L), n):
        yield T[i: i+n]

res_2 = list(chunker(L, 2))  # [('a', 'b'), ('c', 'd'), ('e', 'f')]
res_3 = list(chunker(L, 3))  # [('a', 'b', 'c'), ('d', 'e', 'f')]
res_4 = list(chunker(L, 4))  # [('a', 'b', 'c', 'd'), ('e', 'f')]

否则,您需要首先定义逻辑以确定每个元组的大小。

答案 1 :(得分:0)

您可以将zip与适当的片一起使用:

l = [('a',),('b',),('c',),('d',),('e',),('f',)]

[x+y for x, y in zip(l[::2], l[1::2])]
# [('a', 'b'), ('c', 'd'), ('e', 'f')]

答案 2 :(得分:0)

使用itertools recipe中的 grouper

from itertools import chain, zip_longest

lst = [('a',),('b',),('c',),('d',),('e',),('f',)]

def grouper(n, iterable, fillvalue=None):
    "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return zip_longest(*args, fillvalue=fillvalue)

如何使用?

>>> list(grouper(2, chain.from_iterable(lst)))
[('a', 'b'), ('c', 'd'), ('e', 'f')]
>>> list(grouper(3, chain.from_iterable(lst)))
[('a', 'b', 'c'), ('d', 'e', 'f')]