加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 高级自定义排序

发布时间:2020-12-16 23:15:17 所属栏目:Python 来源:网络整理
导读:我有一个项目列表,我想对多个标准进行排序. 给定输入列表: cols = [ 'Aw H','Hm I1','Aw I2','Hm R','Aw R','Aw I1','Aw E','Hm I2','Hm H','Hm E',] 判据: Hm胡 我 R H ? 输出应该是: cols = [ 'Hm I1','Aw H','Aw E'] 我知道这个函数需要传递给内置的so
我有一个项目列表,我想对多个标准进行排序.

给定输入列表:

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

判据:

> Hm>胡
>我> R> H> ?

输出应该是:

cols = [
   'Hm I1','Aw H','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',]

结果:

>>> 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

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

既然我们首先想要所有元素与’I’在一起,那么’R’,依此类推,我们会先把它放在第一位.为此,我们定义了一个字典,为每个字母提供所需的优先级.当我们在那个字典中查找那个字母(字符串中的第四个字符,s [3])时,就是键的第一部分.

接下来,我们想要那封信之后的数字.为此,我们将使用一些短路来获得第五个字符和向前(s [4:]),或者,如果没有,则使用0.我们将它发送到int,这将评估数字作为一个数字,在“12”之后放置’2’就像它应该的那样.

最后,如果前两个部分相同,则会根据第一个字符对项目进行排序.如果这是一个更简单的排序,我们可以指定reverse = True.如果这部分是一个数字,我们可以采取它的负面.我们只需将该字符转换为带有ord()的数字,然后对其进行否定.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读