Как работает python sorted метод, когда его ключ является лямбда-функцией, которая возвращает логический кортеж - PullRequest
0 голосов
/ 05 мая 2020

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

sorted(s,key = lambda x:(x.isdigit() and int(x)%2==0, x.isdigit(),x.isupper(),x.islower(),x))

Но когда выполняется следующий код, он приводит к следующему выводу: enter image description here

Фактически это решение следующей проблемы на хакерранке: https://www.hackerrank.com/challenges/ginorts/problem

Ответы [ 2 ]

1 голос
/ 05 мая 2020

Он сравнит результаты лямбда-выражения с операторами >:

In [1]: (1,2) > (1,4)                                                                                   
Out[1]: False

In [2]: (2,2) > (1,4)                                                                                   
Out[2]: True

In [3]: (True, False) > (True, True)                                                                    
Out[3]: False

Это похоже на сравнение строк. Первый неравный элемент определяет результат.

0 голосов
/ 05 мая 2020

Функция key вызывается для каждого элемента списка, и возвращаемое ею значение используется в качестве «ключа» сортировки (т. Е. Как значение сравнения вместо фактических элементов списка).

Ваша функция сортировки эквивалентна:

def sort_key(x: str) -> Tuple[bool, bool, bool, bool, str]:
    return (
        x.isdigit() and int(x) % 2 == 0,
        x.isdigit(),
        x.isupper(),
        x.islower(),
        x
    )

(расширена до функции def с аннотациями типов, чтобы мы могли лучше видеть, что она возвращает)

Итак, я могу сделать вывод, что ваш список струн; функция ключа сортировки возвращает кортеж с четырьмя значениями типа bool, которые сообщают нам различные свойства этих строк как значения True / False.

  1. Это четное число.
  2. Это любой вид число.
  3. Все в верхнем регистре.
  4. Все в нижнем регистре.

И пятое значение - это сама строка (которая будет отсортирована по алфавиту). При сравнении кортежей сначала сравнивается первое значение, затем второе, et c. При сравнении значений типа bool False предшествует True. Таким образом, отсортированный список будет сгруппирован по указанным выше четырем категориям в указанном порядке; сначала будут сгруппированы четные числа (в конце списка, потому что True следует за False), затем нечетные числа, затем строки в верхнем регистре, затем строки в нижнем регистре, а затем все остальное. Внутри этих категорий сортировка будет происходить по порядку строк (лексикографически).

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