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

2024-05-13 20:22:57 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

^{pr2}$

我已经有难看的代码来完成这项工作,一旦列表完全弹出,就会超出范围:

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

我想使用理解,但是由于尝试了解压参数列表、反转自引用列表、使用deque队列以及各种代码气味,我现在怀疑寻找(嵌套的)理解解决方案是否有意义?在


Tags: 字符串代码元素列表参数initpopend
2条回答

如果要用特殊的分隔符拆分列表,这里有一个更简洁和通用的方法groupby

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

可以使用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)。在

相关问题 更多 >