如何将嵌套字符串列表转为真实列表?不使用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
相关产品推荐
相关产品推荐

