Как получить записи из all_options, где ключ соответствует записи в selected_options?
С пониманием.У нас есть два вида: списочные и генераторные.
Обратите внимание, что это зависит от того, что вы подразумеваете под «записями».Если вам нужен dict
с совпадающими парами ключ / значение, вам понадобится понимание, которое создает пары ключ / значение, а затем используйте его для создания dict, передавая его конструктору dict
.
Существует специальное синтаксическое правило, которое гласит, что если мы вызываем что-то вызываемое (например, конструктор класса) только с одним аргументом, и этот аргумент является генератором, то нам нужна только одна пара скобок (вместо двух: один для вызова функции, а другой для обозначения понимания как понимания).Это позволяет нам писать очень естественные вещи.
С другой стороны, если вы просто хотите list
ключей, то вы можете просто использовать понимание списка.(Вы также можете передать генераторное понимание конструктору list
.)
Я начал с использования списочного понимания ...
У вас естьнеправильное представление о том, как они работают.Вы не используете их, чтобы выполнить действие повторно;Вы используете их для многократного вычисления результата.Вы не сделаете вызов append
в первой части оператора, потому что (a) понимание уже строит последовательность для вас, поэтому нет причин создавать другую пустую последовательность для добавления;(b) вызов append
возвращает None
после выполнения добавления, поэтому в итоге вы получите список значений None, которые впоследствии выбрасываете.
Понимание списка создает значение .Генераторное понимание также создает значение, но это генератор (поэтому вы должны извлечь его значения, чтобы использовать их).
Итак, как нам написать код?
A list
ключей выглядит следующим образом: для каждого ключа в dict
( итерации по dict
итерации по его ключам ) мы хотим, чтобы этот ключ (без модификации), только если ключ находится в нашемдругое list
.То есть мы хотим [key for key in all_options if key in selected_options]
.И это именно то, как вы пишете это на Python.Язык вряд ли мог бы читать более естественно, оставаясь однозначным.
A dict
пар ключ-значение выглядит так: для каждой пары ключ-значение в парах ключ-значение dict
,мы хотим эту пару, только если ключ находится в нашем другом list
.Мы хотим сделать dict
, используя эти пары ключ-значение, поэтому мы заключаем понимание в конструктор dict
.Чтобы получить пары ключ-значение из dict, мы перебираем его .items()
.Итак, мы хотим получить dict
, построенный из ключа и значения, для каждого ключа и значения в элементах исходного dict
, где ключ находится в другом list
.И снова, это именно то, что мы пишем: dict((key, value) for (key, value) in all_options if key in selected_options)
.
В более поздних версиях Python мы также можем использовать «dict comp понимание», которое в основном является синтаксическим сахаром, чтобы мы могли написать что-то, что выглядит болеекак понимание списка.