Как отсортировать мой список по строке и числам (внешний текстовый файл) - PullRequest
0 голосов
/ 18 декабря 2018

Итак, я попытался использовать код из этого вопроса, и он сработал, но я импортирую текстовый файл в список, и он, похоже, не сортирует его.

Вотмой код:

import re
key_pat = re.compile(r"^(\D+)(\d+)$")
def key(item):
    m = key_pat.match(item)
    return m.group(1), int(m.group(2))

data=[line.strip() for line in open('DieGameScores.txt')]

data.sort( key=key )
print(data)

И вот результат:

['tr35', 'nk32', 'ms49', 'mg41', 'jw40', 'jo13']

Но я хочу, чтобы он вывел это:

['ms49', 'mg41', 'jw40', 'tr35', 'nk32', 'jo13']

Кто-нибудь знает, как это исправить?

Ответы [ 5 ]

0 голосов
/ 18 декабря 2018

Просто удалите первую группу из ключевого вывода, чтобы ваш код выглядел так:

import re
key_pat = re.compile(r"^(\D+)(\d+)$")


def key(item):
    m = key_pat.match(item)
    return int(m.group(2))

data = [line.strip() for line in open('DieGameScores.txt')]

data.sort(key=key, reverse=True)
print(data)

Вывод:

['ms49', 'mg41', 'jw40', 'tr35', 'nk32', 'jo13']
0 голосов
/ 18 декабря 2018

Вы можете сделать что-то вроде

Примечание - Предполагая, что последние два символа являются числами всех элементов

l = ['tr35', 'nk32', 'jw40', 'jo13', 'ms49', 'mg41']

sl = sorted(l, key=lambda x: x[2:], reverse=True)

print(sl)

output

['ms49', 'mg41', 'jw40', 'tr35', 'nk32', 'jo13']
0 голосов
/ 18 декабря 2018

Ваш скрипт в строке

data.sort(key = key)

вызывает функцию, которую вы определили ниже под ключом имени, как некоторый критерий сортировки.Однако, это не роль вашей ключевой функции.

Как говорится, небольшая модификация сработает.Начните с введения:

def my_criteria(a):
    return int(a[-2:])

Затем вызовите сортировку почти так же, как вы это сделали:

data.sort(key=my_criteria, reverse=True)

На этот раз используемый вами ключ фокусируется на int в конце вашей строки каккритерий сортировки, и с обратным = истинным аргументом вы получите то, что, как вы, казалось, пытались получить.

0 голосов
/ 18 декабря 2018

Если вы хотите, чтобы он сортировался сначала по номеру, а затем по строковой части - вам нужно обратить обратное значение в вашей ключевой функции -

return int(m.group(2)), m.group(1) 

И затем, поскольку вы хотите, чтобы оно было в порядке убывания -вам нужно указать обратный аргумент

data.sort(key=key, reverse=True)
0 голосов
/ 18 декабря 2018

Это один из подходов, если вам нужен список, отсортированный по int

Пример:

l = ['tr35', 'nk32', 'ms49', 'mg41', 'jw40', 'jo13']
print(sorted(l, key=lambda x: int("".join(i for i in x if i.isdigit())), reverse=True))

Вывод:

['ms49', 'mg41', 'jw40', 'tr35', 'nk32', 'jo13']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...