【问题标题】:Splitting a list into uneven tuples将列表拆分为不均匀的元组
【发布时间】:2017-01-09 15:29:42
【问题描述】:

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

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 队列和各种代码异味后未成功,我现在怀疑寻找(嵌套) 理解解决方案?

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      您可以使用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')]
      

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

      【讨论】:

      • bool 替换 lambda 函数来转换字符串并得到类似的结果有什么好处吗?
      猜你喜欢
      • 1970-01-01
      • 2013-05-27
      • 2016-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-20
      • 2019-10-05
      相关资源
      最近更新 更多