5

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

IE

['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])

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

4

5 回答 5

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

此外,itertools可能会更有效率。

于 2012-07-04T19:25:12.943 回答
1
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']]
于 2012-07-04T19:27:39.807 回答
0

这适用于从 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']]
于 2012-07-04T19:26:12.687 回答
0
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)]
于 2012-07-04T19:28:07.417 回答
0
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,它是另一个包含该键组中数据的迭代器。
  • 然后将数据的迭代器转换为列表
  • 外部列表是从上面构建的

  • -
于 2012-07-04T19:44:43.853 回答