2024-04-24 10:22:40 发布
网友
假设我有一个简单的列表:
flat_list = ["one", "a", "two", "b", "ab"]
我的目标是得到一个列表列表,每个列表包含长度相同的每个元素,如下所示:
list_lists = [["one", "two"], ["a", "b"], ["ab"]]
有没有可能通过简单的列表理解来实现这一点?你知道吗
这是我的份数:
[[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']的输入将生成一个空列表
flat_list = ["one", "two", "a", "b", "ab", 'eleven']
[['a', 'b'], ['ab'], ['one', 'two'], [], [], ['eleven']]
使用^{}来实现这一点(首先,我们使用sorted按长度对列表排序,以便groupby按我们希望的方式工作):
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]})]
这是我的份数:
尽管我更愿意把它分成两行:
这实际上会为缺少元素的任何大小生成一个空列表,因此
flat_list = ["one", "two", "a", "b", "ab", 'eleven']
的输入将生成一个空列表使用^{} 来实现这一点(首先,我们使用
sorted
按长度对列表排序,以便groupby
按我们希望的方式工作):又一条“纯Python”
可以重写为一个列表comp与一些花哨的步法,仍然需要一个空的dict开始
相关问题 更多 >
编程相关推荐