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

Python中如何使用带多参数的自定义函数实现列表排序?

解决sorted函数中key参数带多参数自定义函数的问题

错误原因

sorted的key参数要求传入一个仅接收单个参数的函数,这个函数会被自动应用到列表的每个元素上。你直接调用sort_by_well_range_1(start=2)时,相当于立刻执行该函数,但此时缺少必填的col参数,因此抛出TypeError。

解决方案

方案1:用lambda表达式包装(最直接)

用lambda接收col参数,再调用你的多参数函数并传入固定的start值:

def sort_by_well_range_1(col, start=1):
    # 注意:循环变量不要用col,避免覆盖函数参数
    a = col.split('_')[start:]
    a = [float(x) for x in a]
    middle_depth = mean(a)
    return middle_depth

a = ['influx_oil_1100_1200','influx_oil_900_1000','influx_oil_1300_1400','influx_oil_800_850']
b = sorted(a, key=lambda col: sort_by_well_range_1(col, start=2), reverse=False)

方案2:用functools.partial固定参数

利用functools.partial将多参数函数转换为单参数函数,固定start的值:

from functools import partial

def sort_by_well_range_1(col, start=1):
    a = col.split('_')[start:]
    a = [float(x) for x in a]
    middle_depth = mean(a)
    return middle_depth

a = ['influx_oil_1100_1200','influx_oil_900_1000','influx_oil_1300_1400','influx_oil_800_850']
# 固定start=2,生成只需要col参数的函数
sorter = partial(sort_by_well_range_1, start=2)
b = sorted(a, key=sorter, reverse=False)

方案3:用闭包重构函数

让外层函数接收start参数,返回一个仅接收col的内层函数:

def sort_by_well_range_1(start=1):
    def inner(col):
        a = col.split('_')[start:]
        a = [float(x) for x in a]
        middle_depth = mean(a)
        return middle_depth
    return inner

a = ['influx_oil_1100_1200','influx_oil_900_1000','influx_oil_1300_1400','influx_oil_800_850']
# 先传入start=2得到inner函数,作为key参数
b = sorted(a, key=sort_by_well_range_1(start=2), reverse=False)

额外注意点

原代码中列表推导式的循环变量col会覆盖函数参数的col,建议改成x或其他变量名,避免潜在的逻辑错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 16:15:36