高级自定义排序

Bar*_* R. 6 python sorting list python-2.7

我有一个项目列表,我想对多个标准进行排序.

给定输入列表:

cols = [
    'Aw H',
    'Hm I1',
    'Aw I2',
    'Hm R',
    'Aw R',
    'Aw I1',
    'Aw E',
    'Hm I2',
    'Hm H',
    'Hm E',
] 
Run Code Online (Sandbox Code Playgroud)

判据:

  • 嗯>噢
  • 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'
]
Run Code Online (Sandbox Code Playgroud)

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

Tig*_*kT3 7

您可以为密钥编写一个函数,返回一个tuple按优先级排序的每个感兴趣的部分.

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',
]
Run Code Online (Sandbox Code Playgroud)

结果:

>>> 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
Run Code Online (Sandbox Code Playgroud)

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

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

接下来,我们想要那封信之后的数字.为此,我们将使用一些短路来获得第五个字符和向前(s[4:]),或者,如果没有,则使用0.我们发送到int,这将评价其放了多少多少'2''12'像它应该是.

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

其结果是键,例如,(0, 2, -65)用于'Aw I2'.