我需要对字符串列表进行排序。
但是,我不想使用第一个字符对其进行排序,因此我无法使用.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']
>>>
有没有这样做,可能是正则表达式?
是否也有可能,所以如果我要在列表中添加更多分数,我仍然可以这样排序吗?
答案 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.split
将x
拆分为更新的部分,以便遇到-
或/
字符 - 这就是[-/]
表达式所代表的含义。然后我们选择第二部分,将其转换为整数并使用该值进行排序。
答案 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
会计算每条记录的密钥,sort
或sorted
会根据此值对records
进行排序。
答案 4 :(得分:-2)
sort
接受可选的关键参数。例如。如果你想按数字的力量对int list进行排序,你可以做[-3, 2, 1].sort(key=lambda x: x *x)
我很确定你可以编写从“Boo Foo - 1000/2000”中提取数字1000的函数。提示:使用split
。