根据项目长度制作子列表

时间:2015-06-12 21:03:39

标签: python list iteration

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

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

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

2 个答案:

答案 0 :(得分:5)

您希望根据项目长度对列表进行分类。因此,您可以根据长度进行排序并对它们进行分组。您可以使用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]]]

这里有一些注意事项:

  • 如果你没有'我想在列表上执行索引或其他操作等操作,您不需要将结果转换为列表(正如我在上面的答案中所做的那样),您可以将结果作为一个非常高效的生成器长列表。

  • 如果您希望在运行时获得更高的性能,可以使用使用哈希表的字典来存储其数据,搜索和插入数据的数据中包含O(1)。 @junnytony建议使用defaultdict的好方法。您也可以使用dict.setdefault方法:

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

答案 1 :(得分:2)

您可以使用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())