如何拆分嵌套列表中含空格与引号的字符串生成目标嵌套列表?
问题描述
我们有一个嵌套列表df1,每个子列表仅包含一个带双引号的长字符串,需要将其转换为不含双引号的标准嵌套列表df2。
原始数据
df1 = [ ['1 "P040" 68.13 "P040_1" 2.55 8'], ['2 "P040" 46.82 "P040_2" 2.53 8'], ['3 "P040" 46.82 "P040_3" 2.51 8'] ]
目标格式
df2 = [ ['1', 'P040', '68.13', 'P040_1', '2.55', '8'], ['2', 'P040', '46.82', 'P040_2', '2.53', '8'], ['3', 'P040', '46.82', 'P040_3', '2.51', '8'] ]
尝试的无效代码
用户尝试了以下代码,但未达到预期效果:
for row in df1: for elem in row: elem.strip().split('"') elem.strip().split('"')
解决方法
方法1:字符串替换+拆分
先移除所有双引号,再按空格拆分字符串,最后过滤拆分后可能出现的空元素:
df2 = [] for row in df1: # 取出子列表中的唯一字符串 raw_str = row[0] # 移除双引号后按空格拆分,过滤空元素 processed_items = [item for item in raw_str.replace('"', '').split() if item] df2.append(processed_items) print(df2)
方法2:正则表达式提取元素
用正则匹配所有不含引号和空格的有效元素,直接提取目标内容:
import re df2 = [] # 匹配所有非引号、非空格的连续字符 pattern = re.compile(r'[^"\s]+') for row in df1: matched_items = pattern.findall(row[0]) df2.append(matched_items) print(df2)
方法3:利用CSV模块解析
这种带引号的格式符合CSV规则,用Python内置csv模块可以自动处理引号包裹的内容:
import csv from io import StringIO df2 = [] for row in df1: # 将字符串转为类文件对象 fake_file = StringIO(row[0]) # 指定空格为分隔符,csv读取器会自动去除引号 reader = csv.reader(fake_file, delimiter=' ') # 取出解析后的行并过滤空元素 processed_items = [item for item in next(reader) if item] df2.append(processed_items) print(df2)
原代码无效原因
- 执行
elem.strip().split('"')后没有将结果赋值给变量,操作结果未被保存; - 直接按引号拆分后会得到包含空字符串的列表,还需二次处理;
- 字符串是不可变类型,所有修改操作不会改变原变量,必须将结果存入新变量。
内容的提问来源于stack exchange,提问作者Skyer
相关产品推荐
相关产品推荐

