将列表拆分为不均匀的元组

时间:2016-09-01 16:38:00

标签: python python-2.7 list list-comprehension itertools

我试图将一个字符串列表拆分为包含这些字符串的不均匀长度的元组列表,每个元组包含最初用空字符串分隔的字符串。基本上我需要可以应用于列表的参数化拆分。如果我的初始列表如下:

init = ['a', 'b', '', 'c', 'd e', 'fgh', '', 'ij', '', '', 'k', 'l', '']

此列表的最后一个元素始终是结束''。可以有连续的'' s,它们应被视为单身。 我需要的结果是:

end = [('a', 'b'), ('c', 'd e', 'fgh'), ('ij',), ('k', 'l')]

我已经有了丑陋的代码来完成工作,并且在列表完全弹出后会超出范围:

end = []
while init[-1] == u'':
 init.pop()
 l = []
 while init[-1] != u'':
  l.append(init.pop())
 end.append(tuple(l))

我想使用理解,但是尝试解压缩参数列表,反转自引用列表,使用deque队列和各种代码气味失败,我现在怀疑它是否成功感觉寻找(嵌套)理解解决方案?

2 个答案:

答案 0 :(得分:4)

您可以使用itertools.groupby功能根据元素的大小对元素进行分组,例如

>>> from itertools import groupby
>>> init = ['a', 'b', '', 'c', 'd e', 'fgh', '', 'ij', '', '', 'k', 'l', '']
>>> [tuple(g) for valid, g in groupby(init, key=lambda x: len(x) != 0) if valid]
[('a', 'b'), ('c', 'd e', 'fgh'), ('ij',), ('k', 'l')]

这基本上根据元素的长度对元素进行分组。如果项目的长度不等于零,则它们将被放入一个组中,直到满足来自另一个组的元素。对于长度不等于零的元素组,key函数将返回True,否则返回False。我们会忽略具有False的组(因此检查if valid)。

答案 1 :(得分:4)

如果您想使用特殊分隔符拆分列表,则使用groupby时,这是一种更简洁,更通用的方法:

>>> delimiter = ''
>>> [tuple(g) for k, g in groupby(init, delimiter.__eq__) if not k]
[('a', 'b'), ('c', 'd e', 'fgh'), ('ij',), ('k', 'l')]