如何使用子字符串对字符串列表进行排序?

时间:2018-07-12 09:20:07

标签: python list sorting

我有一个列表,其元素如下:

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.

由于数字的位数是可变的,所以我很难对这个列表进行排序。

谢谢。

6 个答案:

答案 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?