You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Pythonic方案按kubernetes_pod_name序列拆分字典列表

问题描述

现有包含多个字典的列表l1,每个字典包含kubernetes_pod_name、resolution_ms、value字段。需要将其转换为嵌套列表,每一组包含完整的kubernetes_pod_name值序列(如1、2、3、4),当序列重复时自动拆分,用于后续数据展示。

原列表示例:

l1 = [
    {"kubernetes_pod_name": "1", "resolution_ms": 10, "value": 100},
    {"kubernetes_pod_name": "2", "resolution_ms": 10, "value": 200},
    {"kubernetes_pod_name": "3", "resolution_ms": 10, "value": 300},
    {"kubernetes_pod_name": "4", "resolution_ms": 10, "value": 400},
    {"kubernetes_pod_name": "1", "resolution_ms": 10, "value": 102},
    {"kubernetes_pod_name": "2", "resolution_ms": 10, "value": 302},
    {"kubernetes_pod_name": "3", "resolution_ms": 10, "value": 567},
    {"kubernetes_pod_name": "4", "resolution_ms": 10, "value": 850},
    # ... 更多元素
]

期望转换后的嵌套列表示例:

result = [
    [
        {"kubernetes_pod_name": "1", "resolution_ms": 10, "value": 100},
        {"kubernetes_pod_name": "2", "resolution_ms": 10, "value": 200},
        {"kubernetes_pod_name": "3", "resolution_ms": 10, "value": 300},
        {"kubernetes_pod_name": "4", "resolution_ms": 10, "value": 400}
    ],
    [
        {"kubernetes_pod_name": "1", "resolution_ms": 10, "value": 102},
        {"kubernetes_pod_name": "2", "resolution_ms": 10, "value": 302},
        {"kubernetes_pod_name": "3", "resolution_ms": 10, "value": 567},
        {"kubernetes_pod_name": "4", "resolution_ms": 10, "value": 850}
    ]
    # ... 更多分组
]
Pythonic实现方案

方法1:基于起始标记的分组(适合固定以"1"开头的序列)

利用迭代器遍历列表,每次遇到kubernetes_pod_name为"1"的元素就开启新分组,收集后续元素直到下一个"1"出现:

def group_pod_sequences(lst):
    it = iter(lst)
    result = []
    while True:
        try:
            current_group = []
            # 取出起始元素并加入分组
            first_item = next(it)
            current_group.append(first_item)
            # 收集后续元素,直到遇到下一个起始标记
            for item in it:
                if item["kubernetes_pod_name"] == "1":
                    # 将该元素放回迭代器,供下一轮处理
                    it = [item] + list(it)
                    break
                current_group.append(item)
            result.append(current_group)
        except StopIteration:
            break
    return result

# 调用示例
result = group_pod_sequences(l1)

方法2:基于预期序列的通用分组(支持自定义序列)

如果你的pod名称序列不是固定的1-4,可以先定义预期的序列顺序,按序列循环匹配分组:

from itertools import cycle

def group_by_sequence(lst, expected_sequence):
    seq_cycle = cycle(expected_sequence)
    result = []
    current_group = []
    expected_next = next(seq_cycle)
    
    for item in lst:
        pod_name = item["kubernetes_pod_name"]
        if pod_name == expected_next:
            current_group.append(item)
            expected_next = next(seq_cycle)
            # 当当前组长度等于预期序列长度时,完成一组
            if len(current_group) == len(expected_sequence):
                result.append(current_group)
                current_group = []
                # 重置序列循环,准备下一组
                seq_cycle = cycle(expected_sequence)
                expected_next = next(seq_cycle)
    # 可选:如果有未完成的分组,是否保留(根据需求调整)
    if current_group:
        result.append(current_group)
    return result

# 调用示例,指定预期序列为["1","2","3","4"]
result = group_by_sequence(l1, ["1","2","3","4"])

方法3:使用itertools.groupby分组(基于分组编号)

先给每个元素分配分组编号(每遇到一个"1"就递增编号),再用groupby按编号分组:

from itertools import groupby

def group_pod_sequences_groupby(lst):
    group_num = 0
    groups_info = []
    # 给每个元素标记所属分组编号
    for item in lst:
        if item["kubernetes_pod_name"] == "1":
            group_num += 1
        groups_info.append( (group_num, item) )
    # 按分组编号聚合
    result = []
    for _, group in groupby(groups_info, key=lambda x: x[0]):
        result.append( [item for _, item in group] )
    return result

# 调用示例
result = group_pod_sequences_groupby(l1)

内容的提问来源于stack exchange,提问作者James Xu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 19:35:25