python - 如何按元素长度拆分排序列表
问题描述
我有一个列表列表,它按子列表的长度排序。例如
[[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']]]
解决方案
您可以使用按长度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']]]
推荐阅读
- java - 如何为模型类中的对象编写 TypeConverter
- elasticsearch - elasticsearch 不返回预期回报
- python-3.x - 使用 influxdb-python 的 Influxdb 批量插入
- c# - 为嵌套的 ScriptableObjects 构建编辑器以在纸牌游戏中组合能力
- python - Python 中的 socket.close(fd)。'fd' 是什么意思?
- excel - B 列的数值必须大于 A 列,因为 A 列可能有负值,Excel 中的数据验证
- mongodb - Morphia:如何匹配 mongodb 中的 2 级嵌套文档?
- sql-server - 如何在 SQL-Server 存储过程中编辑记录
- c - 使用 NCurses 向终端发送转义序列
- java - 如何从 java springboot 中的 SOAP 服务创建“https”安全 REST API