Продвинутый курс разработки на Python
Глава
>
Уровень
Расширенные списки
Списковые включения
В этой главе мы рассмотрим новые способы использования списков в Python, касающиеся оптимизации, структурирования и даже создания больших многомерных списков, подобных матрицам, которые по своей структуре напоминают таблицы.
Для этого уровня мы будем работать с генераторами списков – списками, которые можно создать из других списков, выбирая из них только определённые компоненты. Это также делается очень просто, в одну строку кода, без необходимости вручную создавать список или придумывать сложные автоматизации.

Цель
Заберите и отсортируйте все корнеплоды в кладовой, чтобы вы могли разместить их на правильном месте, используя списковые включения.
В кладовой находятся несколько мешков, полных корнеплодов, которые нужно рассортировать, а именно: potatoes, onions и garlic. Вероятно, некоторые овощи испортились. Извлеките те овощи, которые подходят для употребления, и разместите их в ящиках по назначению.
Чтобы выполнить эту задачу, вам необходимо определить, какие предметы находятся в каждом мешке. Существует три константы-списка, содержащие информацию о каждом из мешков, они называются: left_sack, middle_sack, right_sack. Эти константы соответствуют мешкам на поле, расположенным в местах, указанных в их названиях.
Подойдите к светящимся меткам X перед каждым мешком и используйте функцию speak(), чтобы определить содержимое каждого мешка, используя соответствующие константы, например: player.speak(left_sack). После того как вы определите содержимое каждого мешка, выделите те элементы, которые необходимо удалить, такие как овощи, в названии которых встречаются слова: "Bad", "Spoiled" или "Rotten".
Вам нужно создать новые списки, содержащие только пригодные для употребления овощи. Это можно сделать вручную, но это займёт много времени и может привести к путанице. Для более эффективного решения задачи можно создать список на основе другого списка, используя так называемое синтаксис спискового включения.
Из трёх констант-списков: left_sack, middle_sack, right_sack создайте три новых списка с именами: potatoes, onions и garlic, не содержащих нежелательные элементы из мешков. Списковые включения позволяют создавать новые списки без написания большого количества кода, например:
# Original list sack = ["Potatoes", "Sweet Potatoes", "Spoiled Potatoes" ] # List Comprehension potatoes = [x for x in sack if not "Spoiled" in x] # This will create a list named potatoes with: # ["Potatoes", "Sweet Potatoes"]
В приведённом выше примере список с именем potatoes создаётся на основе списка sack и содержит только ["Potatoes", "Sweet Potatoes"], исключая "Spoiled Potatoes". Это достигается за счёт создания самодостаточного цикла for, где переменная x используется для перебора элементов списка, а конструкции for / in помогают идентифицировать и исключить нежелательный элемент, то есть любую строку, содержащую слово "Spoiled".
Вкратце, изучите константы-списки на наличие слов "Bad", "Spoiled" или "Rotten" с помощью функции speak(), затем создайте списки potatoes, onions и garlic, используя синтаксис спискового включения, чтобы удалить нежелательные элементы из каждого списка.
После того как эти списки будут созданы, подойдите к трём (3) золотым меткам X перед ящиками с овощными знаками и поместите созданные списки с помощью функции place() в соответствующие ящики для завершения уровня. Места обозначены знаками: onions в левом ящике, potatoes в среднем ящике и garlic в левом ящике.