У меня проблемы с выяснением, как работает следующий код? - PullRequest
0 голосов
/ 05 мая 2019

Может кто-нибудь объяснить, почему ref_len = 9 после его запуска и как работает вторая строка в приведенном ниже коде?

ref_len_list = [9,9,5,9]
ref_len = min(ref_len_list, key=lambda x:abs(x-8))

Ответы [ 3 ]

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

Линия:

ref_len = min(ref_len_list, key=lambda x:abs(x-8))

будет искать число в ref_len_list, для которого abs(number - 8) имеет наименьшее значение, и, таким образом, является значением, ближайшим к 8. Из этого списка он получает номер 9, потому что abs(9-8) < abs(5-8). Если бы в этом списке были и 9 s, и 7s, он бы просто дал первый из них.

Итак:

min([9,9,5,9], key=lambda x:abs(x-8))  # --> 9
min([7,9,5,6], key=lambda x:abs(x-8))  # --> 7
min([9,7,5,6], key=lambda x:abs(x-8))  # --> 9
min([7,9,5,8], key=lambda x:abs(x-8))  # --> 8


Строка работает с использованием функции min и передаёт ей необязательный аргумент key. Аргумент key будет указывать для функции, какие критерии она должна использовать при ранжировании элементов списка.

В этом случае аргументу key присваивается анонимная функция lambda, которая принимает число x в качестве аргумента и возвращает abs(x-8).

Функция lambda x:abs(x-8)) может быть переписана следующим образом:

def func(x):
    return abs(x-8)
0 голосов
/ 05 мая 2019

min выбирает минимальное значение из списка. Если аргумент отсутствует key, он просто использует сами значения, чтобы определить, что такое «минимум» (т. Е. Из списка чисел несколько очевидно, что такое минимум). Учитывая аргумент key, он использует эту функцию, чтобы получить значение для каждого элемента в списке, который он должен рассмотреть. Это обычно среднее значение для таких случаев:

[{'foo': 3, 'bar': 'baz'}, {'foo': 4}]

min не может просто знать, какое значение он должен использовать здесь, поэтому вы должны сделать min(lst, key=lambda i: i['foo']), который возвращает {'foo': 3, 'bar': 'baz'}, поскольку он имеет самое низкое значение для i['foo'] (3). Но key не должен получать ключ от dict, он может вернуть любое значение, которое он хочет. Здесь возвращается abs(x - 8), поэтому результатом является число, значение которого является наименьшим при вычитании из 8.

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

Вторая строка кода ref_len = min(ref_len_list, key=lambda x:abs(x-8)) просто просматривает первую строку кода ref_len_list = [9,9,5,9] и находит значение, наиболее близкое к 8. Он просто выбирает элемент из списка, который удовлетворяет коду.

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