You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何以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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 11:54:03