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

如何基于类型转换分组列表元素?修正Python分组代码错误

修正列表转字典的代码问题

输入列表如下:

data = [
    -1, 0,
    'a','b', 1, 2, 3,
    'c', 6,
    'd', 'e', .4, .5,
    'a', 'b', 4,
    'f', 'g',
]

需求说明

需要生成一个字典,键为字符串组(用/连接),值为紧跟该组后的数字集合,需满足:

  • 忽略列表开头的非字符串元素
  • 每组字符串数量不固定(至少1个)
  • 重复的字符串组需要合并对应的数字列表

原始代码及问题

你编写的原始代码:

start = list(map(type, data)).index(str)

wanted = {}
for i in data[start:]:
    strings = []
    if type(i) == str:
        strings.append(i)
        numbers = []
    else:
        numbers.append(i)
        
    wanted['/'.join(strings)] = numbers

这段代码的输出结果:

{'a': [], 'b': [4], '': [4], 'c': [6], 'd': [], 'e': [0.4, 0.5], 'f': [], 'g': []}

你的期望输出:

{'a/b': [1, 2, 3, 4], 'c': [6], 'd/e': [0.4, 0.5], 'f/g': []}

修正后的代码

data = [
    -1, 0,
    'a','b', 1, 2, 3,
    'c', 6,
    'd', 'e', .4, .5,
    'a', 'b', 4,
    'f', 'g',
]

# 找到第一个字符串的起始位置,兼容无字符串的情况
try:
    start_idx = next(i for i, val in enumerate(data) if isinstance(val, str))
except StopIteration:
    start_idx = len(data)

wanted = {}
current_strings = []
current_numbers = []

for item in data[start_idx:]:
    if isinstance(item, str):
        # 若已有未处理的字符串组,先存入字典
        if current_strings:
            key = '/'.join(current_strings)
            if key in wanted:
                wanted[key].extend(current_numbers)
            else:
                wanted[key] = current_numbers.copy()
            # 重置分组状态
            current_strings = [item]
            current_numbers = []
        else:
            current_strings.append(item)
    else:
        # 收集当前组的数字
        current_numbers.append(item)

# 处理最后一组未存入的字符串和数字
if current_strings:
    key = '/'.join(current_strings)
    if key in wanted:
        wanted[key].extend(current_numbers)
    else:
        wanted[key] = current_numbers.copy()

print(wanted)

代码说明

  • 起始位置定位:用生成器+next()找到第一个字符串的位置,比原方法更健壮——如果列表中没有字符串,不会抛出异常。
  • 分组收集逻辑:
    • 先收集连续的字符串作为一组,直到碰到数字;
    • 碰到数字就持续收集,直到下一个字符串出现;
    • 遇到新字符串时,先把上一组的字符串(用/拼接)和对应数字存入字典:如果键已存在,就将新数字追加到原有列表;不存在则直接创建键值对,之后重置分组状态。
  • 收尾处理:遍历结束后,必须处理最后一组未存入字典的字符串和数字,避免遗漏。

运行后输出与期望一致:

{'a/b': [1, 2, 3, 4], 'c': [6], 'd/e': [0.4, 0.5], 'f/g': []}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 05:15:29