高级自定义排序

时间:2016-01-14 11:42:08

标签: python list python-2.7 sorting

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

给出输入列表:

module.exports.con = mysql;

标尺:

  • Hm> AW
  • 我> R> H> ë

输出应为:

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

我知道这个函数需要传递给内置的cols = [ 'Hm I1', 'Aw I1', 'Hm I2', 'Aw I2', 'Hm R', 'Aw R', 'Hm H', 'Aw H', 'Hm E', 'Aw E' ] ,但任何想法如何实际写出来?

4 个答案:

答案 0 :(得分: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',
]

结果:

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

由于我们首先希望所有元素与'I'在一起,然后'R',等等,我们首先将其放在首位。为此,我们定义了一个字典,为每个字母提供所需的优先级。当我们在该字典中查找该字母(字符串中的第四个字符s[3])时,键的第一部分就会出现。

接下来,我们想要那封信之后的数字。为此,我们将使用一些短路来获得第五个字符和后续字符(s[4:]),或者,如果没有,则0。我们将其发送到int'2'会将该号码评估为'12' reverse=True之后的数字。

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

结果是'Aw I2' for(int count=0; count < 100; count++) Log.d("Thread 1":"Count : "+count); 的关键字。

答案 1 :(得分:1)

以下内容可行:

{{1}}

<强>输出

{{1}}

答案 2 :(得分:1)

为了比较Aw,Hm和E,H,R,I等,您可以定义两个词典:

现在我们需要将每个字符串解析为三个部分: 1。(Aw或Hm) 2。(E或H或R或I) 3 。整数

现在使用这些组件和字典中的相应值,我们可以从关键函数返回一个元组:

>>> import re
>>> from pprint import pprint
>>> map_1 = {'Aw': 0, 'Hm': 1}
>>> map_2 = {'E': 0, 'H': 1, 'R': 2, 'I': 3}
>>> pattern = re.compile(r'(Aw|Hm)\s([EHRI])(\d*)')
>>> def key_func(x):
    a, b, c = pattern.search(x).groups()
    return map_2[b], -int(c) if c else 0, map_1[a]
...
>>> pprint(sorted(cols, key=key_func, reverse=True))
['Hm I1',
 'Aw I1',
 'Hm I2',
 'Aw I2',
 'Hm R',
 'Aw R',
 'Hm H',
 'Aw H',
 'Hm E',
 'Aw E']

答案 3 :(得分:1)

让我们创造一些东西:

如何为你的信件分配点数?

def custom_sort(string):
    value_dict = {'I':400 ,'R': 300,'H': 200,'E':100, 'Hm': 50, 'Aw':40}
    s = string.split()
    points = value_dict[s[0]] + value_dict[s[1][0]]
    if -len(s[1])>1:
        points -= int(s[1][1:])
    return -points

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

print sorted(cols, key=custom_sort)