Python:如何在数字主排序中执行二级降序字母排序

时间:2016-02-14 00:16:08

标签: python sorting python-3.x

Sorting a Python list by two criteria Fouad给出了以下答案:

sorted(list, key=lambda x: (x[0], -x[1]))

我想主要在元组列表中按以下顺序对每个元素中的第二个项目进行排序,然后按降序排列第一个(字母)项目:

[('Ayoz', 1, 18, 7), ('Aidan', 2, 4, 9), ('Alan', 2, 4, 9), ('Arlan', 5, 6, 7), ('Luke', 15, 16, 2), ('Tariq', 5, 4, 2)] 

给出答案:

[('Ayoz', 1, 18, 7), ('Alan', 2, 4, 9), ('Aidan', 2, 4, 9), ('Tariq', 5, 4, 2), ('Arlan', 5, 6, 7), ('Luke', 15, 16, 2)]

尽可能使用上述方法。 我试过了

tlist = [('Ayoz', 1, 18, 7), ('Aidan', 2, 4, 9), ('Alan', 2, 4, 9), ('Arlan', 5, 6, 7), ('Luke', 15, 16, 2), ('Tariq', 5, 4, 2)]
sorted(tlist, key=lambda elem: (elem[1], -elem[0]))

但只有在elem [0]为数字时才有效(在这种情况下,它给出了一个TypeError:一元的坏操作数类型 - :' str')

我会感激任何帮助。 Python版本是3.4

4 个答案:

答案 0 :(得分:2)

您可以给出原始答案以使其有效:

sorted(tlist, key=lambda elem: (-elem[1], elem[0]), reverse=True)

答案 1 :(得分:1)

tlist = [('Ayoz', 1, 18, 7), ('Alan', 2, 4, 9), ('Aidan', 2, 4, 9), ('Arlan', 5, 6, 7), ('Luke', 15, 16, 2), ('Tariq', 5, 4, 2)] 

sorted(tlist, key=lambda elem: (elem[1],sorted(elem[0],reverse=True)))

已经完成了,但我花了半个小时打字,所以无论如何我都会发布。我仍然欢迎更好的方式。

答案 2 :(得分:1)

Python中的内置排序例程是稳定的。也就是说,如果两个项具有相同的键值,则它们保持它们相对于彼此的顺序(靠近列表前面的那个更接近前面)。因此,您可以使用多个排序过程对多个键进行排序。

from operator import itemgetter

tlist = [('Ayoz', 1, 18, 7), ('Aidan', 2, 4, 9), ('Alan', 2, 4, 9),
         ('Arlan', 5, 6, 7), ('Luke', 15, 16, 2), ('Tariq', 5, 4, 2)]

# sort by name in descending order
tlist.sort(key=itemgetter(0), reverse=True) 
print('pass 1:', tlist)

# sort by element 1 in ascending order.  If two items have the same value
# the names stay in the same order they had (descending order)
tlist.sort(key=itemgetter(1))
print(npass 2:', tlist)

打印:

pass 1: [('Tariq', 5, 4, 2), ('Luke', 15, 16, 2), ('Ayoz', 1, 18, 7), ('Arlan', 5, 6, 7), ('Alan', 2, 4, 9), ('Aidan', 2, 4, 9)]

pass 2: [('Ayoz', 1, 18, 7), ('Alan', 2, 4, 9), ('Aidan', 2, 4, 9), ('Tariq', 5, 4, 2), ('Arlan', 5, 6, 7), ('Luke', 15, 16, 2)]

答案 3 :(得分:0)

这是另一种选择。它的作用类似于使用-number来反转排序顺序,但适用于字母串。

下表将'a'映射为'z','b'映射为'y'等。t[0].translate(table)将'Ayoz'翻译为'Zbla',因此关键('Ayoz',1, 18,7)是(1,Zbla')

table = str.maketrans('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
                      'zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA')

tlist.sort(key=lambda t: (t[1], t[0].translate(table)))