根据特定顺序对字符串和数字列表进行排序
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']
我正在寻找排序 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']