Как работает "key = lambda w: sorted (w)"? - PullRequest
0 голосов
/ 06 января 2020
words = "4of Fo1r pe6ople g3ood th5e the2"
words = sorted(words.split(), key=lambda w:sorted(w))

вывод:

['Fo1r', 'the2', 'g3ood', '4of', 'th5e', 'pe6ople']

Я не понимаю, как эта функция сортирует слова на основе числа в слове

Ответы [ 4 ]

0 голосов
/ 07 января 2020

вместо "отсортированной" функции вы можете использовать свою версию функции, которая сравнивает строку на основе цифр, присутствующих в строке.

ниже я показал функцию для того же

 >>> def mysort(string):
        lst=[]
        final=''
        for char in string:
            if char.isdigit():
                lst.append(char)
        lst.sort()
        for i in lst:
            for word in string.split():
                if i in word:
                    final=final+' '+word
        return final

    output:
>>> words= "4of Fo1r pe6ople g3ood th5e the2"
>>> mysort(words)
' Fo1r the2 g3ood 4of th5e pe6ople'
0 голосов
/ 07 января 2020

sorted Аргумент key - это функция, вызываемая для каждого элемента ввода для получения значения для сортировки. Таким образом, когда само значение key также равно sorted (примечание: key=lambda w:sorted(w) - это просто медленный способ написания key=sorted), это означает, что он сортирует 'Fo1r' для получения значения key ['1', 'F', 'o', 'r']. Поскольку сортировка символов эффективно сортирует их по порядковому значению, а цифры ASCII предшествуют буквам ASCII по порядковому значению, это означает, что в данном конкретном случае, когда в каждом входе по одному уникальному значению di git, а остальная часть каждой строки - буквы, это эффективно сортировка по ди git.

Если бы один и тот же ди git появлялся в более чем одном входе, это привело бы к сортировке по наибольшему порядковому значению, кроме цифры; например, 'abc1' будет сортировать до 'xyz1', потому что сравнение резервирования будет сравнивать 'a' с 'x'. Точно так же, если в некоторых входах появился пробел, но не в других, эти входы будут отсортированы перед всеми остальными (потому что символ пробела - ординал 32, а '0' - ординал 48).

0 голосов
/ 07 января 2020

Вот ваши слова:

>>> words = "4of Fo1r pe6ople g3ood th5e the2"
>>> words = words.split()
>>> words
['4of', 'Fo1r', 'pe6ople', 'g3ood', 'th5e', 'the2']

Вы можете отсортировать буквы каждого слова:

>>> [sorted(w) for w in words]
[['4', 'f', 'o'], ['1', 'F', 'o', 'r'], ['6', 'e', 'e', 'l', 'o', 'p', 'p'], ['3', 'd', 'g', 'o', 'o'], ['5', 'e', 'h', 't'], ['2', 'e', 'h', 't']]

Если вы zip слова и предыдущий список, вы видите каждое слово вместе с ключом:

>>> list(zip(words, [sorted(w) for w in words]))
[('4of', ['4', 'f', 'o']), ('Fo1r', ['1', 'F', 'o', 'r']), ('pe6ople', ['6', 'e', 'e', 'l', 'o', 'p', 'p']), ('g3ood', ['3', 'd', 'g', 'o', 'o']), ('th5e', ['5', 'e', 'h', 't']), ('the2', ['2', 'e', 'h', 't'])]

Вот почему Fo1r (ключ: ['1', 'F', 'o', 'r']) предшествует the2 (ключ: ['2', 'e', 'h', 't']) и так далее ...

0 голосов
/ 07 января 2020

Внутренний sorted упорядочивает символы (буквы и цифры) из каждого слова в соответствии с их числовым кодом c, который является более или менее алфавитным, с цифрами перед буквами. Как вы могли заметить, строки Python часто обрабатываются так же, как и любые другие итерации, такие как списки, наборы или словари. Например, sorted("of4") приводит к списку ["4", "f", "o"], поскольку числовые символы считаются равными go перед буквами. sorted отображает ("For1") в список, начинающийся с «1». Этот список предшествует тому, который начинается с "4", а остальные списки.

Примените sorted к каждому из слов, и он будет более понятен вам.

Более технически, sorted превращает слово в упорядоченный список из 1-буквенной строки. Внешний sorted упорядочивает эти слова, сравнивая соответствующие упорядоченные списки. Списки Python сравниваются поэлементно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...