我有一个列表,其元素如下:
Region_1.csv, Region_33.csv, Region_2.csv, Region_4.csv, Region_105.csv, ....
该列表中的所有数字都在1-105之间,不丢失。 我想根据地区编号对该列表进行排序,使其看起来像这样:
Region_1.csv, Region_2.csv, Region_3.csv, Region_4.csv, Region_105.csv etc.
由于数字的位数是可变的,所以我很难对这个列表进行排序。
谢谢。
答案 0 :(得分:3)
您可以将sorted
与自定义功能一起使用,先按.
然后按_
进行分割:
res = sorted(L, key=lambda x: int(x.split('.')[0].split('_')[-1]))
print(res)
['Region_1.csv', 'Region_2.csv', 'Region_4.csv', 'Region_33.csv', 'Region_105.csv']
答案 1 :(得分:2)
lst.sort(key=lambda x: int(x.split('_')[1].split('.')[0]))
print(lst)
# ['Region_1.csv', 'Region_2.csv', 'Region_4.csv', 'Region_33.csv', 'Region_105.csv']
答案 2 :(得分:2)
如果要在字符串中找到一些奇特的东西,请使用re
模块:
l = ['Region_105.csv', 'Region_1.csv', 'Region_33.csv', 'Region_2.csv', 'Region_4.csv']
import re
print(sorted(l, key=lambda v: int(re.findall('\d+', v)[0])))
输出:
['Region_1.csv','Region_2.csv','Region_4.csv','Region_33.csv', 'Region_105.csv']
答案 3 :(得分:1)
您还可以使用字符串的find
方法:
inList = ['Region_1.csv', 'Region_33.csv', 'Region_2.csv', 'Region_4.csv', 'Region_105.csv']
outList = sorted(inList, key=lambda elem: int(elem[elem.find('_')+1:elem.find('.')]))
print(outList)
输出:
['Region_1.csv', 'Region_2.csv', 'Region_4.csv', 'Region_33.csv', 'Region_105.csv']
答案 4 :(得分:1)
您也可以尝试以下方法:
>>> l = ['Region_105.csv', 'Region_1.csv', 'Region_33.csv', 'Region_2.csv', 'Region_4.csv']
>>> sorted(l, key=lambda x: int(''.join(filter(str.isdigit, x))))
['Region_1.csv', 'Region_2.csv', 'Region_4.csv', 'Region_33.csv', 'Region_105.csv']
答案 5 :(得分:0)
您可以使用正则表达式提取区域编号,并创建{region number:fileName}形式的字典,然后根据键对字典进行排序。 提取区域号并创建字典的代码:
import re
files=['Region_1.csv','Region_33.csv','Region_2.csv','Region_4.csv','Region_105.csv']
d=dict()
for f in files:
rnum=re.find('[a-bA-B]_([0-9])\.csv$',f)
d[rnum]=f
要对字典中的项目进行排序,请参考:How can I sort a dictionary by key?