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

时间:2015-02-06 04:04:13

标签: python list sorting python-3.x

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

我让它按照升序或降序对所有键进行排序:

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']

1 个答案:

答案 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,以便任何两个字符串revs1

s2

"""

(实际上在这个完全一般的表述中,当我记下它时,它比我想象的更难......! - )

在现实生活中,面对如此困难的问题,我会做多次rev(s1) < rev(s2) if and only if s1 > s2 通行证,判决胜利,然后回家: - )