Как отсортировать список строк на основе чисел в нем? - PullRequest
1 голос
/ 08 февраля 2020

Моя проблема действительно странная. Я должен отсортировать список как:

list1=["S01E01","S02E010", "S02E013", "S02E02", "S02E03"]

, и я хочу результат, как:

list1=["S01E01","S02E02", "S02E03", "S02E010", "S02E013"]

Я использовал sort(), sorted(), map() методы, но эти методы не могли сортируйте этот список, так как он уже отсортирован. Если вы введете «010»> «02» в консоли python, она вернет false .

Пожалуйста, предложите мне любой способ отладки этой проблемы.

См. Скриншоты консоли

Ответы [ 4 ]

1 голос
/ 08 февраля 2020

Для этого вам нужно использовать функцию ключа, которая разбивает строку на компоненты и возвращает их в виде кортежа. Любая подстрока, являющаяся числом, должна быть преобразована в целое число, если вы хотите, чтобы ее значение рассматривалось численно, в противном случае оно будет лексикографически (в алфавитном порядке).

Основываясь на данных примера, я думаю, что это будет выглядеть так :

def keyfunc(s):
    return s[0], int(s[1:3]), s[3], int(s[4:])

list1 = ["S01E01","S02E010", "S02E013", "S02E02", "S02E03"]

result = sorted(list1, key=keyfunc)
print(result)  # -> ['S01E01', 'S02E02', 'S02E03', 'S02E010', 'S02E013']
0 голосов
/ 08 февраля 2020

вы могли бы использовать регулярное выражение для извлечения чисел из вашей строки и помещения их в кортеж, потому что при сортировке чисел кортежи сортируются на основе значений по возрастанию индекса (по первому значению, а затем по второму значению и т. Д.). ):

import re

def key(s):
    return tuple(map(int, re.findall(r'\d+', s)))

list1.sort(key=key)
list1

вывод:

['S01E01', 'S02E02', 'S02E03', 'S02E010', 'S02E013']
0 голосов
/ 08 февраля 2020
import re
def key(op):
    return list(map(int, re.match('S(\d+)E(\d+)', op).groups()))

list1 = sorted(list1, key=key)
0 голосов
/ 08 февраля 2020

попробуйте это:

list1=["S01E01","S02E010", "S02E013", "S02E02", "S02E03"]
list1.sort(key = lambda x: int(x[1:3] + x[4:]))

o / p:

['S01E01', 'S02E02', 'S02E03', 'S02E010', 'S02E013']
...