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
相关产品推荐
相关产品推荐

