Как использовать списковое включение, чтобы проверить что-то в одном списке и добавить из другого?

Вопрос или проблема

У меня есть список символов и список “да” и “нет”.

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"]

Объяснение кода

  1. Использование zip: Функция zip берет два или более итерируемых объекта и объединяет их, создавая последовательность кортежей. В нашем случае, она объединяет элементы list1 и list2 в пары (x, cond).

  2. Списковое включение: Мы создаем новый список list3, в который добавляем только те элементы x из list1, для которых соответствующее условие cond в list2 равно "Yes".

  3. Фильтрация: Условие 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, не стесняйтесь обращаться.

Оцените материал
Добавить комментарий

Капча загружается...