我有一个字符串列表,我只想按字符串的特定部分而不是整个字符串进行排序。
我只想对倒数第二部分进行排序 当我使用常规的sort()函数时,我遇到了使用完整字符串值进行排序的问题。 我曾尝试将'key ='选项与split('_')结合使用,但以某种方式无法使它正常工作。
# Key to sort profile files
def sortprofiles(item):
item.split('_')[-2]
# Input
local_hostname = 'ma-tsp-a01'
profile_files = ['/path/to/file/TSP_D01_ma-tsp-a01\n', \
'/path/to/file/TSP_D02_ma-tsp-a02\n', \
'/path/to/file/TSP_ASCS00_ma-tsp-a01\n', \
'/path/ato/file/TSP_DVEBMGS03_ma-tsp-a03\n', \
'/path/to/file/TSP_DVEBMGS01_ma-tsp-a01\n']
# Do stuff
profile_files = [i.split()[0] for i in profile_files]
profile_files.sort(key=sortprofiles)
print(profile_files)
我目前收到以下错误消息:
TypeError: '<' not supported between instances of 'NoneType' and 'NoneType'
我想将列表排序为:['/path/to/file/TSP_ASCS00_ma-tsp-a01', '/path/to/file/TSP_D01_ma-tsp-a01', '/path/to/file/TSP_D02_ma-tsp-a02', '/path/to/file/TSP_DVEBMGS01_ma-tsp-a01', '/path/ato/file/TSP_DVEBMGS03_ma-tsp-a03']
答案 0 :(得分:2)
您可以使用lambda expression并尝试
profile_files = sorted(profile_files, key=lambda x: x.split('_')[1])
列表中的每个字符串都根据_
的出现进行拆分,并考虑第二部分进行排序。
但是,如果字符串的格式不符合您的期望,这可能无法正常工作。
答案 1 :(得分:1)
您没有返回要分割的值,需要从sortprofiles
函数返回它,然后您的函数将按预期工作!
您之前没有返回任何内容,这等效于返回None
,并且当您尝试对None进行<
之类的比较运算符时,会得到TypeError: '<' not supported between instances of 'NoneType' and 'NoneType'
因此以下内容将起作用
def sortprofiles(item):
#You need to return the key you want to sort on
return item.split('_')[-2]
local_hostname = 'ma-tsp-a01'
profile_files = ['/path/to/file/TSP_D01_ma-tsp-a01\n',
'/path/to/file/TSP_D02_ma-tsp-a02\n',
'/path/to/file/TSP_ASCS00_ma-tsp-a01\n',
'/path/ato/file/TSP_DVEBMGS03_ma-tsp-a03\n',
'/path/to/file/TSP_DVEBMGS01_ma-tsp-a01\n']
print(sorted(profile_files, key=sortprofiles))
输出将是
['/path/to/file/TSP_ASCS00_ma-tsp-a01\n', '/path/to/file/TSP_D01_ma-tsp-a01\n', '/path/to/file/TSP_D02_ma-tsp-a02\n', '/path/to/file/TSP_DVEBMGS01_ma-tsp-a01\n', '/path/ato/file/TSP_DVEBMGS03_ma-tsp-a03\n']