根据特定顺序对字符串和数字列表进行排序

sort a list of string and number base on both with specific order

我正在寻找排序 my_list 的最佳实践,例如 my_ordered_list。

my_list = ['1h-data', '1m-data', '15m-data' , '4h-data', '50s-data']
my_ordered_list = ['50s-data', '1m-data', '15m-data', '1h-data', '4h-data']

我可以为字符串部分定义 my_specific 列表,例如: ['s', 'm' , 'h'] 然后先按字符串部分排序两次,然后按整数部分排序两次,最后加入它们,但必须有更好的。

index 试试这个方法:

>>> sorted(my_list, key=lambda x: (['s', 'm', 'h'].index(x.split('-')[0][-1]), int(x.split('-')[0][:-1])))
['50s-data', '1m-data', '15m-data', '1h-data', '4h-data']
>>> 

或者 python 版本 >= Python 3.8,你可以使用海象运算符:

>>> sorted(my_list, key=lambda x: (['s', 'm', 'h'].index((t:=x.split('-')[0])[-1]), int(t[:-1])))
['50s-data', '1m-data', '15m-data', '1h-data', '4h-data']
>>> 

编辑:

如果您有类似 80s 的内容,请尝试:

my_list = ['1h-data', '1m-data', '15m-data' , '4h-data', '80s-data']
dct = {"s": 1, "m": 60, "h": 3600}
def func(x):
    a = x.split('-')[0]
    return int(a[:-1]) * dct.get(a[-1])
print(sorted(my_list, key=func))

输出:

['1m-data', '80s-data', '15m-data', '1h-data', '4h-data']

使用re处理numbers/strings

import re

lookup = {'h': 3600, 'm': 60, 's': 1}
my_list = ['1h-data', '1m-data', '15m-data', '4h-data', '50s-data']
temp = [x.split('-')[0] for x in my_list]
temp = [(int(re.findall(r"(\d+)", x)[0]), re.findall(r"(\D+)", x)[0]) for x in temp]
temp = sorted(temp, key=lambda x: x[0] * lookup[x[1]])
ordered_list = [f'{x[0]}{x[1]}-data' for x in temp]
print(ordered_list)

输出

['50s-data', '1m-data', '15m-data', '1h-data', '4h-data']