我们可以将正在使用的键函数的任何参数与已排序的函数一起传递吗

时间:2018-11-14 19:33:08

标签: python python-3.x sorting

我有一个元素k和一个名为A的列表列表。我必须使用基于A中第k个元素的排序函数对A中的元素进行排序。

Ex:

k=1  
A=[[10,20,30],[100,5,300]]

输出应为

[[100,5,300],[10,20,30]] 

我可以使用下面的代码轻松地做到这一点。

def mysort(x):
    return (x[k])
 k=1
 A=[[10,20,30],[100,5,300]]
 print(sorted(A,key=mysort))

但是我在这里要问的是我想将变量k传递给函数mysort。

4 个答案:

答案 0 :(得分:2)

operator.itemgetter对于特定于 的用例很方便:

from operator import itemgetter

res = sorted(A, key=itemgetter(k))

functools.partial提供了更通用的解决方案:

from functools import partial

def mysort(x, index):
    return x[index]

res = sorted(A, key=partial(mysort, index=k))

答案 1 :(得分:0)

您可以为此创建一个lambda-lambda是(kindof)匿名函数:

k=1
A=[[10,20,30],[100,5,300]]
print(sorted(A,key=lambda x:x[k]))

输出:

[[100, 5, 300], [10, 20, 30]]

此帖子why-are-python-lambdas-useful对其进行了更详细的说明,官方文档位于此处:lambda expressions
lambda lambda x:x[k]使用A的每个元素,并根据它的第k个值对列表进行排序。

答案 2 :(得分:0)

我认为您正在寻找的是这个

def mysort(k):
    return lambda x: x[k]
# ...
sorted(A, key=mysort(k))

幸运的是,这是在标准库的operator中实现的:

from operator import itemgetter
k = 1
sorted(A, key=itemgetter(k))

答案 3 :(得分:0)

您可以使用闭包动态构建关键参数的功能:

def mysort(k):
  def f(x):
    return x[k]
  return f

k=1
A=[[10,20,30],[100,5,300]]
print(sorted(A,key=mysort(k)))