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

如何简洁实现元组列表中指定x区间的y值求和?

简洁实现按区间对元组列表的y值求和

嘿,我来给你分享个更简洁的实现方式,完全不用写一堆重复的elif分支!

原始数据

首先是你提供的元组列表(注意:我把变量名从list改成了data_list,避免覆盖Python内置的list类型):

data_list = [(8.0056, 1.0), (8.0269, 0.6666666666666666), (8.0302, 1.0), (8.0426, 0.3333333333333333), (8.0492, 1.0), (8.0766, 0.6666666666666666), (8.0817, 0.3333333333333333), (8.1297, 1.0), (8.137, 0.3333333333333333), (8.1778, 1.0), (8.1858, 1.0), (8.1948, 1.0), (8.2044, 0.3333333333333333), (8.2143, 0.3333333333333333), (8.3222, 0.3333333333333333), (8.3314, 0.3333333333333333), (8.3627, 0.3333333333333333), (8.3818, 0.3333333333333333), (8.436, 1.0), (8.4816, 0.6666666666666666), (8.4891, 1.0), (8.4932, 0.3333333333333333), (8.5348, 0.3333333333333333), (8.5924, 0.3333333333333333), (8.6229, 0.3333333333333333), (8.6698, 0.6666666666666666), (8.6826, 0.3333333333333333), (8.7485, 0.3333333333333333), (8.782, 1.0), (8.8158, 0.3333333333333333), (8.8382, 0.3333333333333333), (8.8708, 0.3333333333333333), (8.8737, 0.3333333333333333), (8.882, 0.3333333333333333), (9.1274, 1.0), (9.3071, 1.0), (9.3373, 1.0), (9.3564, 1.0), (9.367, 0.3333333333333333), (9.4711, 1.0), (9.5184, 1.0), (9.6954, 1.0), (9.7214, 0.3333333333333333), (9.743, 1.0), (9.8061, 0.3333333333333333), (9.9565, 0.6666666666666666), (10.0249, 0.3333333333333333), (10.0734, 0.6666666666666666), (10.0917, 0.6666666666666666), (10.2095, 1.0), (10.2967, 1.0), (10.3707, 1.0), (10.8679, 1.0), (10.9173, 1.0), (8.0022, 0.3333333333333333), (8.0504, 0.3333333333333333), (8.0527, 0.3333333333333333), (8.0645, 0.3333333333333333), (8.1836, 0.6666666666666666), (8.2122, 0.6666666666666666), (8.2433, 0.6666666666666666), (8.2849, 0.3333333333333333), (8.396, 0.3333333333333333), (8.64, 0.3333333333333333), (8.6793, 0.3333333333333333), (8.8079, 0.3333333333333333), (8.8313, 0.3333333333333333), (8.8396, 0.3333333333333333), (8.8666, 0.3333333333333333), (9.0763, 0.6666666666666666), (9.2683, 0.3333333333333333), (9.7969, 0.6666666666666666), (9.8302, 0.6666666666666666), (10.0856, 0.3333333333333333), (10.2049, 0.6666666666666666), (10.7051, 0.6666666666666666), (8.0082, 0.3333333333333333), (8.0245, 0.3333333333333333), (8.1414, 0.3333333333333333), (8.1661, 0.3333333333333333), (8.2014, 0.3333333333333333), (8.2794, 0.3333333333333333), (8.3103, 0.3333333333333333), (8.4627, 0.3333333333333333), (8.5279, 0.3333333333333333), (8.5326, 0.3333333333333333), (8.5507, 0.3333333333333333), (9.4476, 0.3333333333333333)]

原始实现与输出

你原来用多分支循环的实现代码:

dm = 0.4
item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11 = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
for item in data_list:
    if (8. + 0*dm <= item[0] <= 8. + 1*dm):
        item1 += item[1]
    elif (8. + 1*dm <= item[0] <= 8. + 2*dm):
        item2 += item[1]
    elif (8. + 2*dm <= item[0] <= 8. + 3*dm):
        item3 += item[1]
    elif (8. + 3*dm <= item[0] <= 8. + 4*dm):
        item4 += item[1]
    elif (8. + 4*dm <= item[0] <= 8. + 5*dm):
        item5 += item[1]
    elif (8. + 5*dm <= item[0] <= 8. + 6*dm):
        item6 += item[1]
    elif (8. + 6*dm <= item[0] <= 8. + 7*dm):
        item7 += item[1]
    elif (8. + 7*dm <= item[0] <= 8. + 8*dm):
        item8 += item[1]
    elif (8. + 8*dm <= item[0] <= 8. + 9*dm):
        item9 += item[1]
    elif (8. + 9*dm <= item[0] <= 8. + 10*dm):
        item10 += item[1]
    elif (8. + 10*dm <= item[0] <= 8. + 11*dm):
        item11 += item[1]
y_values = [item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11]
print(y_values)

输出结果:

[17.666666666666664, 8.333333333333332, 4.666666666666667, 6.0, 4.666666666666666, 5.666666666666666, 0.6666666666666666, 2.0, 0, 0, 0]

简洁实现方案

其实完全可以用列表推导式一行搞定核心计算,既简洁又容易维护,还能轻松调整区间数量:

dm = 0.4
start = 8.0
num_intervals = 11

# 核心计算一行完成
y_values = [sum(y for x, y in data_list if start + i*dm <= x <= start + (i+1)*dm) for i in range(num_intervals)]
print(y_values)

运行这段代码会得到和你原来完全一样的输出结果。

为什么这个方案更好?

  • 不用定义一堆重复的item1到item11变量,代码更清爽
  • 如果需要调整区间数量(比如从11个改成15个),只需要修改num_intervals的值就行,不用加一堆elif分支
  • 逻辑清晰,一眼就能看出是对每个区间的y值求和
  • 完全符合你想要的“一行代码”形式(核心计算就是一行)

另外,如果你想让结果更美观,比如保留三位小数,可以再套个round函数:

y_values = [round(sum(y for x, y in data_list if start + i*dm <= x <= start + (i+1)*dm), 3) for i in range(num_intervals)]

这样输出就是[17.667, 8.333, 4.667, 6.0, 4.667, 5.667, 0.667, 2.0, 0, 0, 0],和你提到的示例结果17.666也更接近。

内容的提问来源于stack exchange,提问作者Rebel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:02:36