按字符串中的特定位置对列表进行排序

时间:2019-05-02 06:25:35

标签: python python-3.x string list sorting

我有一个字符串列表,我只想按字符串的特定部分而不是整个字符串进行排序。

我只想对倒数第二部分进行排序 当我使用常规的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']

2 个答案:

答案 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']