Вопрос или проблема
У меня есть список символов и список “да” и “нет”.
list1 = ["A", "B", "C"]
list2 = ["Yes", "No", "Yes"]
Мне бы хотелось сделать что-то вроде:
i = 0
for x in list1:
if list2[i] == "Yes":
list3.append(list1[i])
i += 1
Но с использованием генератора списков или хотя бы какого-то более простого и короткого способа это сделать.
Таким образом, это преобразуется из
list1 = ["A", "B", "C"]
list2 = ["Yes", "No", "Yes"]
list3 = []
В
list3 = ["A", "C"]
Объедините два списка, чтобы сгенерировать пары (x, cond)
, затем проверьте, если "Yes"
:
list3 = [
x
for x, cond in zip(list1, list2)
if cond == "Yes"
]
Поскольку len(list3) ≤ len(list2)
, это хороший индикатор того, что нам нужен if
после for
.
Вы можете фильтровать List1, используя значения из List2:
List1 = ["A", "B", "C"]
List2 = ["Yes", "No", "Yes"]
List3 = [value for i, value in enumerate(List1) if List2[i] == "Yes"]
print(List3)
Ответ или решение
Для решения задачи по объединению и фильтрации элементов из двух списков с использованием спискового включения в Python, ниже приведены детальные разъяснения и рекомендации по коду. Мы имеем два списка: один с символами (list1
), а другой с условиями (list2
), и нам нужно получить новый список, в который будут включены только те элементы из list1
, для которых соответствующий элемент в list2
равен "Yes".
Исходные данные
Исходные списки:
list1 = ["A", "B", "C"]
list2 = ["Yes", "No", "Yes"]
Решение с использованием спискового включения
Мы будем использовать структуру zip
, чтобы объединить элементы из обоих списков в кортежи. Таким образом, мы сможем перебрать их последовательно и применять нужные условия. Вот как это можно сделать:
Синтаксис списка включений
list3 = [x for x, cond in zip(list1, list2) if cond == "Yes"]
Объяснение кода
-
Использование
zip
: Функцияzip
берет два или более итерируемых объекта и объединяет их, создавая последовательность кортежей. В нашем случае, она объединяет элементыlist1
иlist2
в пары(x, cond)
. -
Списковое включение: Мы создаем новый список
list3
, в который добавляем только те элементыx
изlist1
, для которых соответствующее условиеcond
вlist2
равно "Yes". -
Фильтрация: Условие
if cond == "Yes"
гарантирует, что только те элементы, у которых соответствующее значение "Yes", будут включены в новый список.
Пример полного кода
Вот полная реализация с выводом результата:
list1 = ["A", "B", "C"]
list2 = ["Yes", "No", "Yes"]
list3 = [x for x, cond in zip(list1, list2) if cond == "Yes"]
print(list3) # Вывод: ['A', 'C']
Преимущества использования спискового включения
- Читаемость: Код становится более компактным и легким для понимания.
- Эффективность: Списковые включения производят меньше кода и могут быть более производительными, чем аналогичные циклы.
- Гибкость: Вы можете легко изменить критерии фильтрации, просто изменив условие.
Заключение
Используя zip
в сочетании со списковым включением, можно эффективно фильтровать элементы из одного списка на основе условий из другого. Этот метод не только повышает читаемость кода, но и позволяет избежать возможных ошибок, связанных с ручным отслеживанием индексов. Если у вас возникнут дополнительные вопросы или понадобится помощь с другими аспектами Python, не стесняйтесь обращаться.