gpt4 book ai didi

python - 高级自定义排序

转载 作者:太空狗 更新时间:2023-10-29 22:18:31 25 4
gpt4 key购买 nike

我有一个项目列表,我想根据多个标准对其进行排序。

给定输入列表:

cols = [
'Aw H',
'Hm I1',
'Aw I2',
'Hm R',
'Aw R',
'Aw I1',
'Aw E',
'Hm I2',
'Hm H',
'Hm E',
]

标准:

  • 嗯>嗯
  • I > R > H > E

输出应该是:

cols = [
'Hm I1',
'Aw I1',
'Hm I2',
'Aw I2',
'Hm R',
'Aw R',
'Hm H',
'Aw H',
'Hm E',
'Aw E'
]

我知道这个函数需要传递给内置的 sorted() 但有什么想法如何实际编写它吗?

最佳答案

您可以为该键编写一个函数,返回一个元组,每个感兴趣的部分按优先级排序。

def k(s):
m = {'I':0, 'R':1, 'H':2, 'E':3}
return m[s[3]], int(s[4:] or 0), -ord(s[0])

cols = [
'Aw H',
'Hm I1',
'Aw I2',
'Hm R',
'Aw R',
'Aw I1',
'Aw E',
'Hm I2',
'Hm H',
'Hm E',
]

结果:

>>> for i in sorted(cols, key=k):
... print(i)
...
Hm I1
Aw I1
Hm I2
Aw I2
Hm R
Aw R
Hm H
Aw H
Hm E
Aw E

排序元组时,首先比较第一个元素。如果它们相同,则 tuple 按它们的第二个元素排序,依此类推。这类似于普通单词按字母顺序排序的方式。

因为我们首先要将带有'I' 的所有元素放在一起,然后是'R',依此类推,我们将把它放在第一位。为此,我们定义了一个字典,为每个字母赋予其所需的优先级。当我们在该字典中查找该字母(字符串中的第四个字符 s[3])时,会发现 key 的第一部分。

接下来,我们需要那个字母后面的数字。为此,我们将使用一些短路来获取第五个字符及以后的字符 (s[4:]),或者,如果没有,则获取 0。我们将其发送到 int,它会将数字评估为将 '2' 放在 '12' 之后的数字,就像它应该的那样。

最后,如果前两部分相同,项目将根据其第一个字符排序。如果这是一个更简单的排序,我们可以指定 reverse=True。如果这部分是一个数字,我们可以只取它的负数。我们只需使用 ord() 将该字符转换为一个数字,然后取其负数。

结果是 'Aw I2' 的键,例如 (0, 2, -65)

关于python - 高级自定义排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34788757/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com