我有一个字符串列表,我正在尝试按字符串长度列出字符串列表。
即
['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])
我对这段代码很满意,但我试图将理解包含在内。我想使用嵌套的理解来做同样的事情,但我无法弄清楚如何。
答案 0 :(得分: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
可能会更有效率。
答案 1 :(得分: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']]
答案 2 :(得分: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']]
答案 3 :(得分: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)]
答案 4 :(得分: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进行排序
外部列表由上述