处理嵌套列表生成Pandas Series时函数返回长度异常求助
问题分析与解决
问题背景
给定如下嵌套列表数据:
data = [[['INS', 'Y', '18', '021', '28', 'A', '', '', 'AC'], ['REF', '0F', '816383217'], ['HD', '021', '', 'EPO', 'Copayment Level -1', 'IND']], [['INS', 'Y', '18', '024', '07', 'A', '', '', 'TE'], ['REF', '0F', '734419065']], [['INS', 'Y', '18', '024', '07', 'A', '', '', 'TE'], ['REF', '0F', '778954065']]]
需要遍历数据生成一个Pandas Series,每个元素对应外层子列表中的Copayment Level -X里的数字X,不存在则填None。但现有函数返回的列表长度比预期多1:
def copay_level(): l = [] for i in data: for lst in i: for x in lst: if x.startswith('Copayment Level'): x = x.split('-') l.append(x[1]) else: l.append(None) return l copayment_level = pd.Series(copay_level()) print(copayment_level) # 输出: # 0 1 # 1 None # 2 None # 3 None # dtype: object
问题原因
问题出在内层for lst in i循环后的else分支:Python中,for循环的else分支会在循环正常结束(没有被break中断)时执行。第一个外层子列表中,找到匹配项后已经append('1'),但内层循环正常结束后,依然会执行else里的append(None),导致多添加了一个元素。
修正方案
给每个外层子列表设置一个标记,判断是否找到目标值,循环结束后根据标记添加对应内容:
import pandas as pd data = [[['INS', 'Y', '18', '021', '28', 'A', '', '', 'AC'], ['REF', '0F', '816383217'], ['HD', '021', '', 'EPO', 'Copayment Level -1', 'IND']], [['INS', 'Y', '18', '024', '07', 'A', '', '', 'TE'], ['REF', '0F', '734419065']], [['INS', 'Y', '18', '024', '07', 'A', '', '', 'TE'], ['REF', '0F', '778954065']]] def copay_level(): l = [] for i in data: found = False for lst in i: for x in lst: if x.startswith('Copayment Level'): num = x.split('-')[1] l.append(num) found = True break # 找到后跳出内层循环,避免重复处理 if found: break # 跳出中层循环 if not found: l.append(None) return l copayment_level = pd.Series(copay_level()) print(copayment_level) # 输出: # 0 1 # 1 None # 2 None # dtype: object
说明
- 新增
found标记,每个外层循环开始时初始化为False - 找到目标值后,设置
found=True并跳出内层循环,避免不必要的遍历 - 外层循环结束后,根据
found的值决定添加数字还是None,确保每个外层子列表只对应一个结果
内容的提问来源于stack exchange,提问作者Ben Smith
相关产品推荐
相关产品推荐

