根据项目的长度制作子列表

Making Sub Lists Based on Lengths of Items

我想将我有 48 种不同长度的列表拆分为每个项目长度的新列表。我可以做类似

的事情
for item in list:
    if len(item) == 1:
         len1list.append(item)
    if len(item) == 2:
         len2list.append(item)

等等等等,但这需要 48 个 if 语句,只是想知道是否有更 Pythonic 的方式,使用更少的代码行。

您想根据项目长度对列表进行分类。因此,您可以根据长度和组进行排序 them.You 可以使用 itertools.groupby 对子列表(或任何可迭代对象)进行分组:

>>> l=[[1],[3,4],[5],[6,7,8],[4,0],[2],[5,6,7]]
>>> from itertools import groupby
>>> [list(g) for _,g in groupby(sorted(l,key=len),key=len)]
[[[1], [5], [2]], [[3, 4], [4, 0]], [[6, 7, 8], [5, 6, 7]]]

这里有一些注释:

  • 如果您不想对列表进行索引或其他操作,则不需要将结果转换为列表(正如我在上面的回答中所做的那样),您可以让结果是作为一个对于长列表非常有效的生成器。

  • 如果你想在 运行 时间内获得更高的性能,你可以使用使用 hash-table 的字典来存储他们的数据,搜索和插入数据的复杂度为 O(1)他们。 @junnytony 建议使用 defaultdict 的好方法。你也可以使用 dict.setdefault 方法:

    d={}
    for i in main_list:
        d.setdefault(len(i),[]).append(i)
    
    print d.values()
    

您可以使用 defaultdict 个列表。这是一个用每个键的列表初始化的字典,因此您可以使用项目的长度作为键将不同长度的项目附加到适当的列表。

from collections import defaultdict
items_by_length = defaultdict(list)

for item in orig_list:
    items_by_length[len(item)].append(item)

grouped_list = list(items_by_length.values())