【问题标题】:Making Sub Lists Based on Lengths of Items根据项目长度制作子列表
【发布时间】:2015-06-12 21:03:39
【问题描述】:

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

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

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

【问题讨论】:

    标签: python list iteration


    【解决方案1】:

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

    【讨论】:

    • 这行得通!感谢您的快速响应,但由于需要处理大量数据(准确地说是 5x10^80 值),我决定使用简单的数字([1:2])将其切成块,如处理 for 语句需要相当长的时间。
    • @二甲基精氨酸不客气!请查看编辑以获取更多解释!
    【解决方案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())
    

    【讨论】:

    • 哈哈,您的代码几乎完美(参见我的回答)。加点解释,改名list,我就删了。
    • 那里! 14 秒的差异 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 2018-05-05
    • 1970-01-01
    • 2021-07-25
    相关资源
    最近更新 更多