gpt4 book ai didi

python - 如何将附加参数传递给自定义 python 排序函数

转载 作者:太空狗 更新时间:2023-10-29 21:05:48 26 4
gpt4 key购买 nike

背景:

我想知道如何实现高级排序函数,我可以将这些函数作为元组元素传递给 python“已排序”函数的关键参数。

这是一个描述我想做的事情的例子:

class Book:

def __init__(self, name, author, language, cost):
self.name = name
self.author = author
self.language=language
self.cost = cost


bookList = [list of books]

firstLanguage = "Armenian"
possibleLanguages = ["English", "Spanish", "Armenian", "French", "Chinese", "Swahili"]
possibleLanguages.remove("Armenian")

sortedBookList = sorted(bookList, key=(sortByName,
sortByFirstLanguage(firstLanguage), sortByLanguages(possibleLanguages) ))

基本上我想实现上面描述的“sortByFirstLanguage”和“sortByLanguages”函数,这样我就可以将它们作为“key”参数的元组项传递给 python“sorted”函数。下面是一些关于自定义排序函数应该是什么样子的示例代码:

def sortByName(elem):
return elem.name

def sortByFirstLanguage(elem, firstLanguage):
if elem.language == firstLanguage:
return 1
else:
return -1


def sortByLanguages(elem, possibleLanguages):
if elem.language in possibleLanguages:
return possibleLanguages.index(elem.language)

添加。详情:

  1. 我正在使用 python 2.7
  2. 这个问题实际上是使用 Django 查询集而不是对象列表,但为了演示目的,我认为对象列表也有相同的目的。
  3. 此排序的目标是首先按指定的语言排序,然后返回 && 按默认顺序(在本例中为列表顺序)对剩余项目进行排序。

问题:

如上所示,我如何准确地告诉“key”参数将额外参数“firstLanguage”&&“possibleLanguages”传递给自定义排序函数?

最佳答案

正如 Ashish 在评论中指出的那样,我们首先需要组合这些函数,因为 key 只接受一个函数。如果我们返回函数结果的序列(列表、元组),Python 将做正确的事情,如果前面的元素相等(source),则只比较后面(最右边)的元素。

我知道有几种方法可以做到这一点。

使用 lambda:

sortedBookList = sorted(
bookList,
key=lambda elem: (sortByName(elem),
sortByFirstLanguage(elem, firstLanguage),
sortByLanguages(elem, possibleLanguages)))

使用高阶函数:

def key_combiner(*keyfuncs):
def helper(elem):
return [keyfunc(elem) for keyfunc in keyfuncs]
return helper

def sortByFirstLanguage(firstLanguage):
def helper(elem):
return elem.language == firstLanguage # True > False
return helper

def sortByLanguages(possibleLanguages):
def helper(elem):
if elem.language in possibleLanguages:
return possibleLanguages.index(elem.language)
return helper

sortedBookList = sorted(bookList,
key=key_combiner(sortByName,
sortByFirstLanguage(firstLanguage),
sortByLanguages(possibleLanguages))

Lambda 对我来说似乎是最干净的,所以我可能会使用它。

关于python - 如何将附加参数传递给自定义 python 排序函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19622827/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com