Python:使用嵌套的理解将字符串列表按长度拆分为字符串列表

Python:使用嵌套的理解将字符串列表按长度拆分为字符串列表,python,nested,list-comprehension,Python,Nested,List Comprehension,我有一个字符串列表,我正在尝试按字符串长度列出一个字符串列表 i、 e 变成 [['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]) 我对这段代码没意见,但

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

i、 e

变成

[['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])
我对这段代码没意见,但我正试着去理解它。我想用嵌套的理解来做同样的事情,但我不知道怎么做

>>> [[w for w in L if len(w) == num] for num in set(len(i) for i in L)]
[['a', 'b'], ['ab'], ['abc']]

另外,
itertools
可能会更高效。

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

但是,如果只想列出
a
中的长度,则必须使用
set(len(i)表示lst中的i)
而不是range

>>> 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']]
导致

请注意,由于groupby仅对相邻元素起作用,因此您可能需要在mylist上强制使用key=len进行排序)

  • 返回一个迭代器,该迭代器具有键(将是长度)和VAL,VAL是包含该键组中数据的另一个迭代器
  • 然后将数据迭代器转换为列表
  • 外部列表将从上面生成

  • -
稳定排序
key=len
(也在groupby上)@JBernardo:谢谢,我一直在想这个,但你抢先一步;-)
>>> 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']]
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']]
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)]
from itertools import groupby

mylist = ['a', 'b', 'ab', 'abc']
[list(vals) for key, vals in groupby(mylist, lambda L: len(L))]