如何以Pythonic方式将列表按指定范围分割为多个子列表?
问题描述
我有一个覆盖多个常用范围的整数列表,找到了实现方法,代码可以正常运行,但我想知道有没有兼顾可读性的更优实现?
编辑补充:建议有同类需求的开发者查阅本问题下的所有回答,不同方案各有优劣,在此感谢所有提供帮助的开发者。
原可运行但不够优雅的代码
my_list = [1, 2, 11, 29, 37] r1_lim = 10 r2_lim = 20 r3_lim = 30 r4_lim = 40 r1_goodvals = list(range(1, r1_lim+1)) print("r1_goodvals : ", r1_goodvals) r2_goodvals = list(range(r1_lim+1, r2_lim+1)) print("r1_goodvals : ", r2_goodvals) r3_goodvals = list(range(r2_lim+1, r3_lim+1)) print("r3_goodvals : ", r3_goodvals) r4_goodvals = list(range(r3_lim+1, r4_lim+1)) print("r4_goodvals : ", r4_goodvals) r1, r2, r3, r4 = [], [], [], [] for x in my_list: if x in r1_goodvals: r1.append(x) elif x in r2_goodvals: r2.append(x) elif x in r3_goodvals: r3.append(x) elif x in r4_goodvals: r4.append(x) print("r1 : ", r1) print("r2 : ", r2) print("r3 : ", r3) print("r4 : ", r4)
原代码输出结果
r1_goodvals : [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] r1_goodvals : [11, 12, 13, 14, 15, 16, 17, 18, 19, 20] r3_goodvals : [21, 22, 23, 24, 25, 26, 27, 28, 29, 30] r4_goodvals : [31, 32, 33, 34, 35, 36, 37, 38, 39, 40] r1 : [1, 2] r2 : [11] r3 : [29] r4 : [37]
优化实现方案
方案1:直接区间判断(可读性最高,适合固定区间场景)
去掉了提前生成区间列表的冗余逻辑,直接用数值大小判断所属区间,判断效率从原有的O(n)降到O(1),逻辑直观易懂,输出和原代码完全一致:
my_list = [1, 2, 11, 29, 37] # 区间上限定义 r1_lim, r2_lim, r3_lim, r4_lim = 10, 20, 30, 40 r1, r2, r3, r4 = [], [], [], [] for x in my_list: if x <= r1_lim: r1.append(x) elif x <= r2_lim: r2.append(x) elif x <= r3_lim: r3.append(x) elif x <= r4_lim: r4.append(x) # 打印区间范围 print("r1_goodvals : ", list(range(1, r1_lim+1))) print("r2_goodvals : ", list(range(r1_lim+1, r2_lim+1))) print("r3_goodvals : ", list(range(r2_lim+1, r3_lim+1))) print("r4_goodvals : ", list(range(r3_lim+1, r4_lim+1))) # 打印拆分结果 print(f"r1 : {r1}\nr2 : {r2}\nr3 : {r3}\nr4 : {r4}")
方案2:通用可扩展版本(适合区间数量可变场景)
如果后续需要增减区间、修改区间上限,仅需要修改range_limits配置即可,不需要改动核心拆分逻辑,扩展性更强:
my_list = [1, 2, 11, 29, 37] # 区间上限按从小到大排序,增减区间直接改这个列表即可 range_limits = [10, 20, 30, 40] # 自动初始化对应数量的结果列表 result = [[] for _ in range(len(range_limits))] for x in my_list: for idx, limit in enumerate(range_limits): if x <= limit: result[idx].append(x) break # 打印所有区间范围 for idx, limit in enumerate(range_limits): start = 1 if idx == 0 else range_limits[idx-1] + 1 print(f"r{idx+1}_goodvals : {list(range(start, limit+1))}") # 打印所有拆分结果 for idx, res in enumerate(result, 1): print(f"r{idx} : {res}")
内容的提问来源于stack exchange,提问作者Windy71
相关产品推荐
相关产品推荐

