Python中如何成对比较嵌套列表元素并筛选列表
嵌套列表的条件过滤实现方案
嘿,这个需求不难搞定,我来给你一步步拆解并提供可运行的代码方案~
核心逻辑梳理
首先明确你的需求:
- 遍历嵌套列表,依次用当前子列表的第3个元素(Python索引为2,因为从0开始)和前一个被保留的子列表的第3个元素做计算
- 根据计算结果(比如比值>0.05、比值==1等)判断是否保留当前子列表,不满足条件就移除
- 第一个子列表没有前置元素,默认保留
代码实现(Python)
这里假设你的第3个元素是可直接参与计算的数值类型(如果是字符串标识,后面会补充处理方式):
# 你的原始嵌套列表 original_list = [ ['Asan', '20180418', 17935.00, '17935.00'], ['Asan', '20180417', 17948.00, '17948.00'], ['Asan', '20180416', 17979.00, '17979.00'], ['Asan', '20180416', 17816.00, '17816.00'], # ... 省略其他子列表 ['Asan', '20180415', 18027.00, '18027.00'] ] def filter_nested_list(lst): # 处理空列表的边界情况 if not lst: return [] # 初始化结果列表,先保留第一个元素 filtered_result = [lst[0]] # 从第二个元素开始遍历原始列表 for current_item in lst[1:]: # 获取前一个保留元素的第3个值 prev_value = filtered_result[-1][2] # 获取当前元素的第3个值 current_value = current_item[2] # 这里按你的需求写判断条件,可根据实际调整 # 示例1:当前值/前一个值 > 0.05 if (current_value / prev_value) > 0.05: filtered_result.append(current_item) # 示例2:当前值/前一个值 == 1 elif (current_value / prev_value) == 1: filtered_result.append(current_item) # 其他条件可以继续加elif... # 不满足任何条件则跳过(即移除当前子列表) return filtered_result # 调用函数得到结果 final_list = filter_nested_list(original_list) print(final_list)
特殊情况处理
如果你的第3个元素是类似'A'、'B'的非数值标识,那需要先建立标识与数值的映射,再做计算:
# 假设标识对应的数值映射 value_mapping = { 'A': 17935.00, 'B': 17948.00, 'C': 17979.00, 'D': 17816.00, # ... 补充其他标识的映射 'N': 18027.00 } # 修改函数内的数值获取逻辑: prev_value = value_mapping[filtered_result[-1][2]] current_value = value_mapping[current_item[2]]
注意事项
- 如果你实际需要的是相对变化幅度超过5%(比如涨跌幅度),更合理的计算方式是:
if abs(current_value - prev_value) / prev_value > 0.05: - 记得处理数值转换的异常(比如如果字符串无法转成数值,可以加
try-except块避免报错)
内容的提问来源于stack exchange,提问作者A.Aminidad
相关产品推荐
相关产品推荐

