我正在尝试编写可以按未知数量的键对列表列表进行排序的代码,每个键都有一个关联的布尔值,对应于排序应该是升序还是降序。
我让它按照升序或降序对所有键进行排序:
import operator
def sort2D(table, *params):
table.sort(key=operator.itemgetter(*params), reverse = True)
return table
table = sort2D(table, *listOfKeys)
我不知道如何将布尔值输入到该函数中。当我尝试为第二个输入列表执行类似的代码时出现语法错误,如下所示:
import operator
def sort2D(table, *params, *args): #this is the line that causes the syntax error
table.sort(key=operator.itemgetter(*params), reverse = *args)
return table
table = sort2D(table, *listOfKeys, *listOfBools)
我可以说错误是因为我误用*,* 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]对应于列,bool将是[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']
答案 0 :(得分:3)
您不能将两个 *something
参数添加到单个函数中。无论如何,您也无法将多个reverse=
值应用于单个sort
来电。
不幸的是,使用多个reverse
值的唯一干净,完全通用的方法(不知道密钥是否可能被反转的是字符串,数字,元组......)很多{{1传递(反过来:最重要的键必须是你最后排序的键)。
所以...
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)
函数然后进行单遍排序(将符号更改为对应于相应反转bool的真值的数字)。
但对于一般键来说这是一个非常具有挑战性的问题 - 例如,我甚至无法想出一种有效地为元组做到这一点的方法! -
即使只是为了字符串,我认为至少是一个谷歌面试级别的问题 - "定义一个函数key
,以便任何两个字符串rev
和s1
,
s2
"""
(实际上在这个完全一般的表述中,当我记下它时,它比我想象的更难......! - )
在现实生活中,面对如此困难的问题,我会做多次rev(s1) < rev(s2) if and only if s1 > s2
通行证,判决胜利,然后回家: - )