【问题标题】:Python sorting by multiple criteriaPython按多个标准排序
【发布时间】:2014-05-15 19:33:27
【问题描述】:

我有一个列表,其中每个元素的格式为[list of integers, integer]。 例如,列表的一个元素可能看起来像这样[[1,3,1,2], -1]

我想按以下标准对包含所描述元素类型的列表进行排序:

  1. 如果两个元素的整数列表(即element[0])的长度不同,则整数列表越小的元素越小。

  2. 否则,如果整数列表的长度相同,则较小的元素是具有较小整数的第一个整数,在两个元素的整数列表中不同。例如:

    [[1,1,99,100], -1]

  3. 否则,如果整数列表相同,则较小的元素是element[1] 中整数较小的元素。

我将如何编写可以传递给 sorted() 或 sort() 的适当键函数?

【问题讨论】:

  • 只有规范,没有尝试?
  • 投票重新开放:“最低限度的理解”的理由在这里被过度应用了;尝试了解 Python 中排序的工作原理是提出问题的正当理由。

标签: python sorting


【解决方案1】:

列出您的密钥中的三个条件:

sorted(inputlist, key=lambda e: (len(e[0]), e[0], e[1]))

现在您首先按长度对每个元素进行排序,然后直接比较第一个元素(仅在第一个元素长度相等时使用),然后按最后一个整数的值。

Python 按字典顺序对元组和列表进行排序;比较第一个元素,只有在没有差异的情况下,才比较第二个元素,依此类推。

这里的第二个元素是e[0],仅当两个比较条目具有相等长度的嵌套列表时才会使用它。这些再次按字典顺序进行比较,因此将元素配对,直到一对不同。

【讨论】:

  • 如果我们希望其中一个条件是字符串的降序排列?
  • @Thanasis 如果所有其他条件都是数字,则否定它们的排序键值并添加reverse=True。否则,使用连续排序,首先使用最右边的条件,然后是下一个,等等。Python 的排序是稳定的,允许您以这种方式组合条件
  • @Thanasis:这是一个带有代码的答案:stackoverflow.com/a/55866810/100297
  • 我有以下列表 a = ['01-19 WK', '02-19 WK', '03-19 WK', '01-19 WE', '01-20 WK' , '02-20 WK'] 并且我想要以下内容:a = ['01-19 WK', '01-19 WE', '02-19 WK', '03-19 WK', '01 -20 周','02-20 周'] 。我写了以下内容: k = sorted(sorted(a, key =lambda e: (e[3:5], e[:3])), key = lambda e: e[-2:], reverse=True ) 但它似乎不起作用
  • 我想我做到了。我只需要颠倒短路的顺序: sorted(sorted(a, key = lambda e: e[-2:], reverse=True), key =lambda e: (e[3:5], e[: 3]))
【解决方案2】:
key = lambda x: (len(x[0]), x[0], x[1])

之所以有效,是因为通过依次查看每个元素直到发现差异来比较元组(和列表)。因此,当您想按优先顺序对多个条件进行排序时,只需将每个条件以相同的顺序粘贴到元组的一个元素中即可。

我假设“较小”与“较小”的含义相同,也就是说您是要比较绝对值。

【讨论】:

    猜你喜欢
    • 2011-03-10
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 2012-11-25
    • 1970-01-01
    • 2018-08-06
    相关资源
    最近更新 更多