Python中的复杂排序

时间:2015-03-11 21:01:06

标签: regex sorting python-3.x

我需要对字符串列表进行排序。

但是,我不想使用第一个字符对其进行排序,因此我无法使用.sort()

我有一个清单:

records = ["Bibble - 1300 / 2000",
"Jim Foo - 900 / 2000",
"Bibble - 1600 / 2000",
"Bibble - 1000 / 2000"]

我想按照2000年的分数排序。 我想要一个看起来像这样的输出:

>>> Jim Foo - 900 / 2000
Bibble - 1000 / 2000
Bibble - 1300 / 2000
Bibble - 1600 / 2000

在上面的例子中,我按最小到最大排序。我也想知道如何将这个列表的最高分数排在最低分。

我已经尝试了.sort(),但它并不像我想要的那样。 .sort()使用我不想要的第一个字符对其进行排序:

>>> records.sort()
>>> records
['Bibble - 1000 / 2000', 'Bibble - 1300 / 2000', 'Bibble - 1600 / 2000', 'Jim Foo - 900 / 2000']
>>> 

有没有这样做,可能是正则表达式?

是否也有可能,所以如果我要在列表中添加更多分数,我仍然可以这样排序吗?

5 个答案:

答案 0 :(得分:3)

您可以使用sorted功能使用key,并使用re.split

>>> import re
>>> sorted(records,key=lambda x:int(re.split(r'[-/]',x)[1].strip()))
['John Smith - 900 / 2000',
 'Bob Foo - 1000 / 2000', 
 'Bob Foo - 1300 / 2000', 
 'Bob Foo - 1600 / 2000']

sorted功能会根据其关键功能对您的列表进行排序,并且您的键将您的元素与re.split分开,其功能如下:

re.split(r'[-/]',x)

模式[-/]根据-/拆分字符串。

例如:

>>> re.split(r'[-/]',"Bob Foo - 1600 / 2000")
['Bob Foo ', ' 1600 ', ' 2000']

然后你需要strip()删除前导和尾随空格。然后转换为int并根据该值对列表进行排序!

答案 1 :(得分:0)

def f(e):
    a, b = map(float, e.split('-')[1].split('/'))
    return a / b

records.sort(key=f)

答案 2 :(得分:0)

使用排序方法的key属性:

import re
records.sort(key = lambda x: int(re.split('[-/]', x)[1]))

re.splitx拆分为更新的部分,以便遇到-/字符 - 这就是[-/]表达式所代表的含义。然后我们选择第二部分,将其转换为整数并使用该值进行排序。

答案 3 :(得分:0)

>>> import re
>>> records = ["Bob Foo - 1300 / 2000",
"John Smith - 900 / 2000",
"Bob Foo - 1600 / 2000",
"Bob Foo - 1000 / 2000"]
>>> def get_score(s):
    m = re.match(r'.* - (\d+) / 2000', s)
    return 0 if m is None else int(m.group(1))

>>> sorted(records, key=get_score)
['John Smith - 900 / 2000', 'Bob Foo - 1000 / 2000', 'Bob Foo - 1300 / 2000', 'Bob Foo - 1600 / 2000']

get_score会计算每条记录的密钥,sortsorted会根据此值对records进行排序。

答案 4 :(得分:-2)

  1. sort接受可选的关键参数。例如。如果你想按数字的力量对int list进行排序,你可以做[-3, 2, 1].sort(key=lambda x: x *x)

  2. 之类的事情
  3. 我很确定你可以编写从“Boo Foo - 1000/2000”中提取数字1000的函数。提示:使用split