从一维列表创建列表列表,按长度对每个元素进行分组

2024-04-24 10:22:40 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个简单的列表:

flat_list = ["one", "a", "two", "b", "ab"]

我的目标是得到一个列表列表,每个列表包含长度相同的每个元素,如下所示:

list_lists = [["one", "two"], ["a", "b"], ["ab"]]

有没有可能通过简单的列表理解来实现这一点?你知道吗


Tags: 元素目标列表abonelistslisttwo
3条回答

这是我的份数:

[[el for el in flat_list if len(el) == target_size + 1] for target_size in range(max([len(el) for el in flat_list]))]

尽管我更愿意把它分成两行:

max_len = max([len(el) for el in flat_list])
[[el for el in flat_list if len(el) == target_size + 1] for target_size in range(max_len )]

这实际上会为缺少元素的任何大小生成一个空列表,因此flat_list = ["one", "two", "a", "b", "ab", 'eleven']的输入将生成一个空列表

[['a', 'b'], ['ab'], ['one', 'two'], [], [], ['eleven']]

使用^{}来实现这一点(首先,我们使用sorted按长度对列表排序,以便groupby按我们希望的方式工作):

[list(group) for key, group in groupby(sorted(flat_list, key=len, reverse=True), len)]

>>> from itertools import groupby
>>> flat_list = ["one", "two", "a", "b", "ab"]
>>> list_of_lists = [list(group) for key, group in groupby(sorted(flat_list, key=len, reverse=True), len)]
>>> 
>>> list_of_lists
[['one', 'two'], ['ab'], ['a', 'b']]
>>> 

又一条“纯Python”

flat_list = ["one", "two", "a", "b", "ab"]

d = {}
for w in flat_list:
    d.update({len(w): d.setdefault(len(w), []) + [w]})
list(d.values())

Out[99]: [['one', 'two'], ['a', 'b'], ['ab']]  

可以重写为一个列表comp与一些花哨的步法,仍然需要一个空的dict开始

d = {}
[list(d.values())
 for w in flat_list + [''] if w == ''
                              or d.update({len(w): d.setdefault(len(w), []) + [w]})]

相关问题 更多 >