#python #sorting #lambda
#python #сортировка #лямбда
Вопрос:
Я попытался запустить этот код
#create a list (user_id, number_of_friends)
num_friends_by_id = [(user["id"], number_of_friends(user))
for user in users]
sorted(num_friends_by_id, # get it sorted
key=lambda (user_id, num_friends): num_friends, # by num_friends
reverse=True) # largest to smallest
# each pair is (user_id, num_friends)
# [(1, 3), (2, 3), (3, 3), (5, 3), (8, 3),# (0, 2), (4, 2), (6, 2), (7, 2), (9, 1)]
Но это всегда выдает мне эту ошибку
File "C:/Users/jaide/Desktop/Ramdom.ipynb", line 41
key=lambda (user_id, num_friends): num_friends, # by num_friends
^
SyntaxError: invalid syntax
Любая помощь?
Комментарии:
1. вероятно, вам просто нужно
lambda user_id, num_friends: num_friends
, но это недопустимая ключевая функция, которой будет передан только один аргумент, поэтому вы обмениваете SyntaxError на возможную ошибку времени выполнения2. Python 2 позволил вам распаковать аргумент последовательности; Python 3 удалил его (IIRC, потому что он был сочтен не стоящим сложности, которую он добавил к синтаксическому анализатору).
3. Не стоит сложности, которую это добавило к самоанализу.
Ответ №1:
Синтаксис для лямбда-функции следующий: lambda arguments : expression
. Итак, в вашем коде неправильный синтаксис из-за скобок.
Другая ошибка заключается в том, key
что аргумент в sorted
функции принимает вызываемый объект или лямбда-выражение с ОДНИМ аргументом. То, что вы сделали, — это попытались распаковать значение элемента, переданного в лямбда-выражение, а затем отсортировать его по второму аргументу. Но вы не можете выполнить распаковку в аргументах лямбда-функции. Вместо этого, поскольку мы знаем, что каждый элемент в вашем списке является кортежем, где первым элементом является user_id, а вторым — num_friends , мы можем получить доступ ко второму элементу каждого кортежа по индексу 1
(нулевая индексация). И с помощью этого мы можем отсортировать список по num_friends:
sorted(num_friends_by_id, key=lambda x: x[1], reverse=True)
Комментарии:
1. Похоже, что ваш аргумент в первом абзаце
lambda user_id, num_friends: expression
также имеет неправильный синтаксис из-за запятой.2. лямбда-функции могут иметь несколько аргументов. В случае
key
аргумента дляsorted
функции лямбда-функции требуется только один аргумент. Который я указал во втором разделе…