Сортировать список по определенному месту в строке - PullRequest
0 голосов
/ 02 мая 2019

У меня есть список строк, и я хочу отсортировать его только по определенной части строки, а не по полной строке.

Я бы хотел отсортировать весь список, сосредоточив внимание только на второй части. Когда я использую обычные функции 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 ]

2 голосов
/ 02 мая 2019

Вы можете использовать лямбда-выражение и попробовать

profile_files = sorted(profile_files, key=lambda x: x.split('_')[1])

Каждая строка в списке разбивается на основе вхождения _, а вторая часть рассматривается для сортировки.

Но это может не сработать, если строки не в том формате, который вы ожидаете.

1 голос
/ 02 мая 2019

Вы не возвращаете значение того, как вы хотите разделить, вам нужно вернуть его из функции 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']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...