#python #string #sorting #dictionary
Вопрос:
пожалуйста, сначала прочитайте код; я пытаюсь ознакомиться с пользовательской сортировкой, поэтому мне нужна помощь в понимании того, как «eksge» сортируется на «выродков» и что происходит внутри функции def sortbypattern, как сначала появляется «g», а затем «e», «e», «k», «s»; кто-нибудь может объяснить мне алгоритм и пробный запуск
def sortbyPattern(pat, str):
priority = list(pat)
# Create a dictionary to store priority of each character
myDict = { priority[i] : i for i in range(len(priority))}
str = list(str)
# Pass lambda function as key in sort function
str.sort( key = lambda ele : myDict[ele])
# Reverse the string using reverse()
str.reverse()
new_str = ''.join(str)
return new_str
if __name__=='__main__':
pat = "asbcklfdmegnot"
str = "eksge"
new_str = sortbyPattern(pat, str)
print(new_str)
Вывод : выродки
Комментарии:
1. Что именно вы не понимаете?
2. Кроме того, вам действительно никогда не следует называть переменную
str
3. Я думаю, что если вы выведете значение myDict, а затем просмотрите документацию по методу сортировки списка (), вы поймете это
4. я попробую, этот код на самом деле от geeksforgeeks, geeksforgeeks.org/… . все дело в том , что мы все знаем обычные методы сортировки, верно? я ищу в Интернете способ сортировки по своему усмотрению . например, допустим, меня зовут Паркер . и я даю строку «rkearp» . мне нужна программа, чтобы отсортировать ее или переставить эту строку в Parker. у тебя есть какие-нибудь идеи ? кроме того, что я уже перечислил
Ответ №1:
sortbyPattern
Функция принимает pattern
и string
сортируется в качестве параметров. Это pattern
работает как список приоритетов здесь. Чем меньше номер индекса, тем ниже приоритет.
Внутри функции priority
находится список символов в pattern
. Приведенная схема такова asbcklfdmegnot
. Если вы напечатаете priority
, вы получите:
['a', 's', 'b', 'c', 'k', 'l', 'f', 'd', 'm', 'e', 'g', 'n', 'o', 't']
Таким образом, поскольку чем ниже индекс, тем ниже приоритет, мы можем создать диктант, имеющий оценку приоритета, аналогичную их соответствующему индексу. Вот что делается в очереди myDict = { priority[i] : i for i in range(len(priority))}
. Диктант выглядит так:
{'a': 0, 's': 1, 'b': 2, 'c': 3, 'k': 4, 'l': 5, 'f': 6, 'd': 7, 'm': 8, 'e': 9, 'g': 10, 'n': 11, 'o': 12, 't': 13}
Теперь str = list(str)
вызывается, чтобы составить список символов внутри входной str
переменной, eksge
. Затем str.sort( key = lambda ele : myDict[ele])
наносится. Это в основном сортировалось на str
основе значения каждого символа str
в диктанте myDict
. Таким str
образом, он сортируется в порядке возрастания на основе значения каждого символа, от которого он получил myDict
. В этой ситуации мы попали в str
:
['s', 'k', 'e', 'e', 'g']
Наконец, str.reverse()
сделали str
обратное, следовательно str
, в нужном порядке.
Следует отметить, что если бы вы выполнили reverse=True
параметр сортировки, вам не нужно было бы вызывать его str.reverse()
Комментарии:
1. Огромное спасибо за полное объяснение процесса и процесса выполнения Теперь я понимаю этот код намного лучше.
2. @Barry99 Если это ответ на ваш вопрос, подумайте о том, чтобы принять его.
Ответ №2:
Я не знаю, в чем может быть польза от такой функции, но это довольно просто:
pat
, затемpriority
(что, кстати, совершенно бесполезный шаг) и, наконецmyDict
, укажите ожидаемый порядок символовsort
сортирует вашу строку, сравнивая каждый символ на основе приоритета отmyDict
вместо стандартного алфавитного порядка
Комментарии:
1. да, но я хочу знать, как myDict дает » g » первый приоритет, затем два e, затем k и s . Я попытался самостоятельно отсортировать свое имя по куче перемешанных алфавитов, но это не работает
2. Как вы, вероятно, можете видеть сейчас благодаря подробному ответу devReddit, этот пользовательский сортировка будет правильно работать с «Barry» с любым беспорядочным алфавитом, где «y» предшествует «r», который предшествует «a», который предшествует «b»: например, «sktygfrqawvbn» подойдет
3. Да, Это Сработало. Теперь я понимаю намного лучше. Спасибо