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

如何将嵌套字符串列表转为真实列表?不使用eval/exec及库实现转换

嵌套字符串列表转实际列表对象的解决方案

针对你提出的两个问题,我来一步步拆解解决:


1. 通用场景:嵌套字符串列表转实际列表对象

如果没有严格的限制(比如安全顾虑、禁用特定函数),最直接的方式是用eval(),它能直接把符合Python语法的字符串转换成对应的对象:

string = '[1,2,3,[4,5,6],7,[8,[9,10]],11]'
new_list = eval(string)
print(new_list)  # 输出: [1,2,3,[4,5,6],7,[8,[9,10]],11]

不过要注意,eval()会执行字符串中的任意代码,如果字符串来自不可信来源,这会有严重的安全风险。这种情况下,更安全的方式是用标准库的json.loads()(因为你的字符串格式和JSON数组兼容):

import json
string = '[1,2,3,[4,5,6],7,[8,[9,10]],11]'
new_list = json.loads(string)
print(new_list)

json.loads()只会解析JSON格式的内容,不会执行代码,安全性高很多。


2. 禁用eval/exec和第三方库的手动实现

如果必须完全避开这些工具,那我们得自己写一个递归解析器,手动处理嵌套结构。核心思路是遍历字符串,跟踪当前的层级(处理嵌套的[]),收集数字,遇到嵌套时递归处理:

def str_to_nested_list(s):
    # 先去掉字符串首尾的[],处理内部内容
    s = s.strip()
    if not s or s[0] != '[' or s[-1] != ']':
        raise ValueError("输入不是有效的列表格式字符串")
    s = s[1:-1].strip()
    result = []
    current_num = ''
    i = 0
    n = len(s)
    
    while i < n:
        char = s[i]
        if char == '[':
            # 找到匹配的右括号,处理嵌套
            bracket_count = 1
            j = i + 1
            while j < n and bracket_count > 0:
                if s[j] == '[':
                    bracket_count += 1
                elif s[j] == ']':
                    bracket_count -= 1
                j += 1
            # 递归处理嵌套的子字符串
            sub_list = str_to_nested_list(s[i:j])
            result.append(sub_list)
            i = j
        elif char in ', ':
            # 遇到分隔符,把收集的数字转成整数加入列表
            if current_num:
                result.append(int(current_num))
                current_num = ''
            i += 1
        else:
            # 收集数字字符
            current_num += char
            i += 1
    # 处理最后一个数字
    if current_num:
        result.append(int(current_num))
    return result

# 测试
string = '[1,2,3,[4,5,6],7,[8,[9,10]],11]'
new_list = str_to_nested_list(string)
print(new_list)  # 输出: [1,2,3,[4,5,6],7,[8,[9,10]],11]

这个函数的逻辑是:

  • 先验证输入字符串的首尾是否为[],不符合就抛出错误
  • 遍历字符串,遇到[时,找到对应的],截取子串递归调用自身处理嵌套列表
  • 遇到逗号或空格时,把之前收集的数字转成整数加入结果列表
  • 其他字符(数字)就收集起来,直到遇到分隔符或字符串结束

需要注意,这个实现只处理整数类型的元素,如果需要支持浮点数或其他类型,可以扩展数字处理的逻辑。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 20:27:36