python - 如何对字符串和 int 值数组、按字母顺序和 "reversed"字母顺序的多个属性进行排序

标签 python string list sorting alphabetical-sort

我有一个包含 [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)]

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

最佳答案

您可以创建一个实现 < 的类( < 是 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

然后将其用作 key对于 sorted :

>>> sorted(a, key=Sorter)
[('Yana', 'Anja', 10, 0),
 ('Kolia', 'Alexey', 10, 0),
 ('Vasia', 'Katia', 3, 0),
 ('Petia', 'Anja', 3, 0),
 ('Petia', 'Katia', 3, 0)]

关于python - 如何对字符串和 int 值数组、按字母顺序和 "reversed"字母顺序的多个属性进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51293341/

相关文章:

Python - 如何获取每个列表的第一行?

list - 为什么我得到 "Exception: Prelude.head: empty list"?

python - 如何根据列表元素的条件拆分 Pandas Dataframe 中的列表列?

python - Python数据列表问题

python - 使用 `sys.getsizeof(Var)` 方法与 `ctypes.sizeof(Var)` 的 python 大小的 ctypes

string - 字符串列表上不区分大小写的模式匹配

c++ - 如何 strcpy 并返回复制的字符数?

java - 如何按字母顺序对列表进行排序?

python - pandas dataframe - 返回 iloc 中的值,如果不存在则返回零

python - 根据列中的不同条目过滤 pandas 数据框(逗号分隔的字符串列表)