对具有多个键和未知的上升/下降的列表进行排序

2024-10-02 20:41:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试编写代码,可以按未知的键数对列表进行排序,每个键都有一个关联的布尔值,对应于排序是升序还是降序。在

我让它按升序或降序对所有键进行排序,如下所示:

import operator

def sort2D(table, *params):
    table.sort(key=operator.itemgetter(*params), reverse = True) 
    return table

table = sort2D(table, *listOfKeys)

不过,我不知道如何将布尔值输入该函数。当我尝试为第二个输入列表执行类似的代码时,出现语法错误,如下所示:

^{pr2}$

我可以判断错误是因为我在函数中误用了*、*params和*args来输入一个列表,但是我不知道如果没有类似的东西,我怎么能输入第二个列表。是否可以将第二个列表输入到我拥有的函数中,或者我必须做一些完全不同的事情来完成我想要的?在

编辑:我希望输入和输出的示例如下所示:

['Smith', 'Bob', 4, 3.75, 'Blue']
['Jones', 'Tom', 17, 0.44, 'Blue']
['Smith', 'John', 3, 2.22, 'Yellow']
['Jones', 'Drew', 5, 6.74, 'Red']

如果按姓氏降序排序,然后按整数升序排序,则与列对应的params将为[0,2],bools将为[True,False]。输出如下所示:

['Smith', 'John', 3, 2.22, 'Yellow']
['Smith', 'Bob', 4, 3.75, 'Blue']
['Jones', 'Drew', 5, 6.74, 'Red']
['Jones', 'Tom', 17, 0.44, 'Blue']

Tags: 函数代码true列表排序tableblueparams
1条回答
网友
1楼 · 发布于 2024-10-02 20:41:19

一个函数不能有两个参数。无论如何,也不能将多个reverse=值应用于单个sort调用。在

不幸的是,使用多个reverse值(不知道可能被反转的键是字符串、数字、元组等)的唯一干净、完全通用的方法是执行多个sort传递(相反:最重要的键必须是最后排序的键)。在

所以…:

def sort2D(table, params, reverses):
    for parm, rev in reversed(zip(params, reverses)):
        table.sort(key=operator.itemgetter(parm), reverse=rev) 
    return table

table = sort2D(table, listOfKeys, listOfBools)

如果你知道你要排序的键(项),例如它们都是数字,你可以准备一个单独的key函数,然后进行单次排序(将符号改为对应于相应反转bool的真值的数字)。在

但是对于一般键来说,这是一个非常具有挑战性的问题,例如,对于元组,我甚至想不出一种有效的方法来实现它!-)在

即使只是针对字符串,我也相信至少是一个Google访谈级别的问题“定义一个函数rev,这样对于任何一个两个字符串s1和{}

^{pr2}$

“”

(实际上,在这个完全通用的公式中,它比我在记下它时所想的要难得多。。。!-)在

在现实生活中,面对这样一个难题,我会做多次传球,判令胜利,然后出发家庭:-)在

相关问题 更多 >