【问题标题】:Python: split list of strings to a list of lists of strings by length with a nested comprehensionsPython:使用嵌套推导将字符串列表按长度拆分为字符串列表列表
【发布时间】:2012-07-04 19:20:45
【问题描述】:

我有一个字符串列表,我正在尝试按字符串长度制作一个字符串列表。

['a', 'b', 'ab', 'abc'] 

变成

[['a', 'b'], ['ab'], ['abc']]

我是这样完成的:

lst = ['a', 'b', 'ab', 'abc']
lsts = []
for num in set(len(i) for i in lst):
    lsts.append([w for w in lst if len(w) == num])

我对那段代码很好,但我正试图将我的头脑围绕在理解上。我想使用嵌套推导来做同样的事情,但我不知道怎么做。

【问题讨论】:

    标签: python nested list-comprehension


    【解决方案1】:
    >>> [[w for w in L if len(w) == num] for num in set(len(i) for i in L)]
    [['a', 'b'], ['ab'], ['abc']]
    

    另外,itertools 的效率可能会更高一些。

    【讨论】:

      【解决方案2】:
      lst = ['a', 'b', 'ab', 'abc']
      lst.sort(key=len) # does not make any change on this data,but
                        # all strings of given length must occur together
      
      
      from itertools import groupby
      lst = [list(grp) for i,grp in groupby(lst, key=len)]
      

      结果

      [['a', 'b'], ['ab'], ['abc']]
      

      【讨论】:

      • 稳定排序...key=len(也在groupby上)
      • @JBernardo:谢谢,我在考虑这个,但你打败了我;-)
      【解决方案3】:
      L=['a','b','ab','abc']
      result = [ [ w for w in L if len(w) == n] for n in set(len(i) for i in L)]
      

      【讨论】:

        【解决方案4】:

        这适用于从 1 到最大值的所有长度(如果 a 列表中没有该长度的字符串,则某些列表将为空):

        >>> a = ['a', 'b', 'ab', 'abc']
        >>> m = max(len(x) for x in a)
        >>> print [[x for x in a if len(x) == i + 1] for i in range(m)]
        [['a', 'b'], ['ab'], ['abc']]
        

        但是,如果您只想列出 a 中的长度,则必须使用 set(len(i) for i in lst) 而不是范围。

        >>> print [[x for x in a if len(x) == i] for i in set(len(k) for k in a)]
        [['a', 'b'], ['ab'], ['abc']]
        

        列表['a', 'b', 'ab', 'abc'] 没有区别。但是如果你稍微改变一下,例如:[['a', 'b'], ['ab'], ['abcd']],你就会看到不同:

        >>> a = ['a', 'b', 'ab', 'abcd']
        >>> print [[x for x in a if len(x) == i] for i in set(len(k) for k in a)]
        [['a', 'b'], ['ab'], ['abcd']]
        
        >>> print [[x for x in a if len(x) == i + 1] for i in range(max(len(x) for x in a))]
        [['a', 'b'], ['ab'], [], ['abcd']]
        

        【讨论】:

          【解决方案5】:
          from itertools import groupby
          
          mylist = ['a', 'b', 'ab', 'abc']
          [list(vals) for key, vals in groupby(mylist, lambda L: len(L))]
          

          请注意,由于 groupby 仅适用于相邻元素 - 您可能需要使用 key=len 强制对 mylist 进行排序

          • 返回一个迭代器,其中包含键(将是长度)和 vals,它是另一个包含该键组中数据的迭代器。
          • 然后将数据的迭代器转换成列表
          • 外部列表是从上面构建的

          • -

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-02-08
            • 2019-08-21
            • 1970-01-01
            • 2019-04-16
            • 1970-01-01
            • 2021-11-25
            相关资源
            最近更新 更多