【问题标题】:How to sort in decreasing value first then increasing in second value [duplicate]如何先按递减值排序,然后按第二个值递增[重复]
【发布时间】:2013-05-14 07:43:04
【问题描述】:

假设我有:

student_tuples = [ ('john', 'A', 15),
                   ('peter', 'B', 12),
                   ('dave', 'C', 12)]

如何将其排序为这样:

student_tuples = [('john', 'A', 15), ('dave', 'C', 12), ('peter', 'B', 12)]

我能想到的是:

from operator import itemgetter

sorted(student_tuples, key=itemgetter(2,0), reverse=True)

然后输出将是:

student_tuples = [('john', 'A', 15), ('peter', 'B', 12), ('dave', 'C', 12)]

这不是我想要的。我怎样才能使用 itemgetter 或任何其他更简单的方法呢?

【问题讨论】:

  • 查看post。我想这里有你需要的一切。
  • 对于它的价值,我不相信这是重复的。这个问题是专门询问如何按一个降序键和一个升序键排序,而“重复”只是询问多个键。
  • @RichieHindle "One [...] and one [...]" 在语法上等同于 multiple;因此,“按一个 desc[...] 和 asc[...] 排序”与“[sorting by] 多个键”完全相同。
  • 不确定是否值得重新打开然后再次关闭。

标签: python sorting


【解决方案1】:

这样做:

print sorted(student_tuples, key=lambda t: (-t[2], t[0]))
# [('john', 'A', 15), ('dave', 'C', 12), ('peter', 'B', 12)]

【讨论】:

  • 分两次排序是更好的方法。否定键方法仅适用于数字键。
【解决方案2】:

编写自己的密钥获取函数。

student_tuples = [ ('john', 'A', 15), ('peter', 'B', 12), ('dave', 'C', 12)]

def student_key(args):
    name, letter, number = args
    return (-number, name)

>>> sorted(student_tuples, key=student_key)
[('john', 'A', 15), ('dave', 'C', 12), ('peter', 'B', 12)]

【讨论】:

  • 绝对是最易读的方式
  • @Schoolboy 是的,他们是一样的,只有在我发布自己的帖子时才看到他的。如果我看到他的,我就不会发布它。 SO 是否有针对这些情况的政策?
  • @Schoolboy 不,它并不完全相同:在 Adrian 的解决方案中,有一个解包,这意味着三个对象分配给标识符 name,letter,number 是不必要的,正如 RichieHindle 的解决方案所示.
  • @eyquem 我就是这么说的!!让我改写我的其他评论...
  • 不,没有什么比我所知道的“政策”更好的了。但有时,(我猜不是这里)人们只是输入与其他人相同的内容,只是为了代表......但在这里你的情况,差别太小,不能说你这样做了,我认为你也没有这样做(复制另一个答案),这只是一个巧合...... :)
【解决方案3】:

如果您没有可以轻松取反的数字字段,那么您始终可以进行两阶段排序,这取决于 Python 的 .sort 是稳定的:

student_tuples.sort(key=itemgetter(0))
student_tuples.sort(key=itemgetter(2), reverse=True)

【讨论】:

  • +1 这是预期的方式。
【解决方案4】:

嵌套排序。最外层排序中最重要/第一优先级排序。

student_tuples = [ ('john', 'A', 15),
                   ('peter', 'B', 12),
                   ('dave', 'C', 12)]

from operator import itemgetter

sorted_ = sorted(sorted(student_tuples,key = itemgetter(0)), key=itemgetter(2), reverse=True)

给予

>>> sorted_
[('john', 'A', 15), ('dave', 'C', 12), ('peter', 'B', 12)]

【讨论】:

    猜你喜欢
    • 2022-01-10
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 2016-11-07
    • 1970-01-01
    • 2016-11-03
    • 2021-09-18
    • 2013-11-19
    相关资源
    最近更新 更多