我正在尝试制作排行榜。 这是我有一个清单:
list=['rami4\n', 'kev13\n', 'demian6\n']
我希望能够将此列表从最高编号到最小编号,甚至从最小编号到最高编号,给出类似下面的内容:
list=['kev13\n', 'demian6\n', 'rami4\n']
我尝试使用像re.findall('\d+', list[loop])[0]
这样的东西,但我只是设法从列表中获得最好的玩家。不想为尽可能多的玩家重复代码,有没有人有想法?
答案 0 :(得分:3)
reg = re.compile('\w*?(\d+)\\n')
lst.sort(key=lambda s: int(reg.match(s).group(1)))
使用findall()
也可以正常工作:
reg = re.compile('\d+')
lst.sort(key=lambda s: int(reg.findall(s)[0]))
请注意我compile()
正则表达式,因此它一劳永逸地计算,而不是列表中的每个元素。
答案 1 :(得分:1)
我有另一种基于面向对象编程的解决方案以及__lt__
str
import re
class SpecialString(str):
def __lt__(self, other):
pattern=re.compile(r"\d+")
return int(pattern.search(str(self)).group(0)) < int(pattern.search(str(other)).group(0))
if __name__ == "__main__":
listing = ['rami4\n', 'kev13\n', 'demian6\n']
spe_list = [SpecialString(x) for x in listing]
spe_list.sort()
print(spe_list)
特殊方法的覆盖。
['rami4\n', 'demian6\n', 'kev13\n']
打印到标准输出:
sort
此方法允许您不重写str
函数并使用内置函数(可能已优化)。更重要的是,因为你的字符串可能被认为是@RequestMapping(value = "/some/link", produces = "application/json")
@ResponseBody
public AnyDto suggestMapping(@Valid @RequestBody(required = false) SomeDto dto) throws Exception {
///some code
return null;
}
类&#34;的特化,继承机制非常适合,因为你保留了它的所有属性,但重写了它的比较机制。