【问题标题】:Sort a list of lists with multiple keys and unknown ascend/descend使用多个键和未知的升序/降序对列表列表进行排序
【发布时间】:2015-02-06 04:04:12
【问题描述】:

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

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

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] 对应的列,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']

【问题讨论】:

  • 您不需要使用参数打包 (*) 将列表传递给函数。
  • 如果你给出一个你想要的输入和输出的具体例子会有所帮助。

标签: python list sorting python-3.x


【解决方案1】:

一个函数不能有两个 *something 参数。无论如何,您也不能将多个 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函数然后进行单遍排序(将符号更改为对应于相应反转布尔值的真值的数字)。

但对于通用键来说,这是一个非常具有挑战性的问题——例如,我什至想不出一种有效地处理元组的方法!-)

即使只为字符串做这件事,我相信至少是一个谷歌面试级别的问题——“定义一个函数 rev 这样,对于 any 两个字符串 s1s2,

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

"""

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

在现实生活中,面对如此棘手的问题,我会多次sort传球,宣判胜利,然后回家:-)

【讨论】:

    猜你喜欢
    • 2016-10-18
    • 2017-01-31
    • 2020-10-05
    • 1970-01-01
    • 2021-12-24
    • 2021-07-19
    • 1970-01-01
    • 2018-05-03
    相关资源
    最近更新 更多