如何对包含字符串和整数值的数组进行排序,具有多个属性按字母顺序和“反向”字母顺序排序。

3
我有一个包含[name,surname,int1,int2]元素的数组,我需要按照以下顺序进行排序:

  • int1(降序)排序。

  • 如果int1相同,则以“反向”字母顺序对name进行排序。

  • 如果name相同,则按字母顺序对surname排序。

所以我有这个:

print(sorted(a, key = lambda x: [-int(x[2]), x[0], x[1]]))

我不知道如何按字母顺序将x[0]倒序排列,-x[0], x[0][::-1]对我没有效果。

示例:

[('Petia', 'Anja', 3, 0),
 ('Vasia', 'Katia', 3, 0),
 ('Petia', 'Katia', 3, 0),
 ('Kolia', 'Alexey', 10, 0),
 ('Yana', 'Anja', 10, 0)]

to

[('Yana', 'Anja', 10, 0),
 ('Kolia', 'Alexey', 10, 0),
 ('Vasia', 'Katia', 3, 0),
 ('Petia', 'Anja', 3, 0),
 ('Petia', 'Katia', 3, 0)]

你是指反向字母顺序,比如从z到a,还是指在反转的字符串上按字母顺序排列? - user3483203
@user3483203 z->a 是的。我添加了一些示例。 - Sova
2个回答

4
你可以创建一个类,并实现 << 是所有CPython的 sorted 所需的 - 如果你使用其他Python实现,可能需要额外的比较运算符)。这允许完全控制“排序”。例如:
class Sorter(object):
    def __init__(self, tup):
        self.name, self.surname, self.int1, self.int2 = tup
    def __lt__(self, other):
        # Just to make the logic clearer, in practise you could do nest the ifs
        # to avoid computing self.int1 == other.int1 twice
        if self.int1 == other.int1 and self.name == other.name:
            return self.surname < other.surname
        elif self.int1 == other.int1:
            return self.name > other.name
        else:
            return self.int1 > other.int1

然后将其用作sortedkey
>>> sorted(a, key=Sorter)
[('Yana', 'Anja', 10, 0),
 ('Kolia', 'Alexey', 10, 0),
 ('Vasia', 'Katia', 3, 0),
 ('Petia', 'Anja', 3, 0),
 ('Petia', 'Katia', 3, 0)]

0
>>> intab='abcdefghijklmnopqrstuvwxyz'
>>> tab = string.maketrans(intab+intab.upper(), intab[::-1]+intab.upper()[::-1])
>>> 
>>> slst = sorted(lst, key = lambda x: [-int(x[2]), x[0].translate(tab), x[1]])
>>> pprint(slst)
[('Yana', 'Anja', 10, 0),
 ('Kolia', 'Alexey', 10, 0),
 ('Vasia', 'Katia', 3, 0),
 ('Petia', 'Anja', 3, 0),
 ('Petia', 'Katia', 3, 0)]
>>> 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接