Мне нужна помощь , кто-нибудь может объяснить пользовательский код сортировки ниже ; как именно работают блоки кода?

#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. Да, Это Сработало. Теперь я понимаю намного лучше. Спасибо