首页 > 解决方案 > 如何按元素长度拆分排序列表

问题描述

我有一个列表列表,它按子列表的长度排序。例如

[[str], [str1, str2], [str1, str2], [str1, str2, str3], [str1, str2, str3],...]

我想将此列表拆分为仅包含具有相同长度的子列表的子列表。例如

[[[str], [str], [str]],  [[str1, str2], [str1, str2], [str1, str2]], ...]

我想知道是否有比我下面的更有效的方法,希望代码少一点。

child_list = []
new_list = []
old_list = [['e3510000'], ['e2512001'], ['e3510000'], ['e92d4010'],
            ['e3a0b000', 'e3a0e000'], ['e92d4030', 'e59f5054'],
            ['e59f3038', 'e3530000'], ['e1a0c00d', 'e92dd800']]

# length of child
length = 1
for idx, i in enumerate(old_list):
    if idx == len(old_list)-1:
        child_list.append(i)
        new_list.append(child_list.copy())
    elif length == len(i):
        child_list.append(i)
    elif length < len(i):
        new_list.append(child_list.copy())
        del child_list[:]
        child_list.append(i)
        length = len(i)

输出:

[[['e3510000'], ['e2512001'], ['e3510000'], ['e92d4010']],
 [['e3a0b000', 'e3a0e000'], ['e92d4030', 'e59f5054'], 
  ['e59f3038', 'e3530000'], ['e1a0c00d', 'e92dd800']]]

标签: pythonlistsortingsplit

解决方案


您可以使用按长度itertools.groupby对列表进行分组。old请注意,如果原始列表已按照您的示例中的长度进行排序,则无需在此处进行排序。

from itertools import groupby
[list(v) for k,v in groupby(sorted(old_list, key=len), key=len)]

输出

[[['e3510000'], ['e2512001'], ['e3510000'], ['e92d4010']],
 [['e3a0b000', 'e3a0e000'],
  ['e92d4030', 'e59f5054'],
  ['e59f3038', 'e3530000'],
  ['e1a0c00d', 'e92dd800']]]

推荐阅读