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

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

问题描述:

我正在尝试编写可以按未知数量的键对列表进行排序的代码,每个键都有一个关联的布尔值,上升或下降。使用多个键和未知的上升/下降对列表进行排序

我有工作要排序的所有键升序或类似这样的递减顺序:

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) 

我可以告诉大家,这个错误是因为我滥用*,*参数,可以和*参数传递给在函数中输入一个列表,但我不知道如何输入第二个列表,但没有看起来类似的东西。是否有可能将第二个列表输入到我所拥有的函数中,还是必须完成一些完全不同的工作来完成我想要的功能?

编辑:我需要的输入和输出的例子将是这个样子:

['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]对应的列和布尔将是[真,假]。输出应该是这样的:

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

你并不需要使用参数包装('* ')将一个列表传递给一个函数。 – grc 2015-02-06 04:08:24

+0

如果你给出一个你想要的输入和输出的小实例,它会有所帮助。 – 2015-02-06 04:22:01

不能有 *something参数,功能单一。无论如何,您也不能将多个reverse=值应用于单个sort调用。

不幸的是,使用多个reverse值(不知道密钥是否可能被反转,是字符串,数字,元组等)的唯一干净的,完全一般的方法是:最重要的键必须是你最后排序的键)。

所以...:

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的真实值相对应的数字)。

但它是一般键一个真正具有挑战性的问题 - 我甚至不能想办法来有效元组做的,例如 - !)

即使这样做只是为了字符串我会相信至少是谷歌面试层次的问题 - “定义一个函数rev这样,对于任何两个字符串s1s2

rev(s1) < rev(s2) if and only if s1 > s2 

‘’”

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

在现实生活中,面对这样的难题,我会做多sort通行证,判令胜利了,回家:-)