Как удалить «нули» параллельно из двух списков в Python?

Я столкнулся с проблемой, которую, очевидно, можно 9X_pythonic решить с помощью серии циклов и условных 9X_pythonista операторов, но мне было интересно, есть 9X_python ли особенно простой и элегантный способ 9X_py сделать это с помощью Python.

В основном 9X_pythonista у меня есть два списка целых чисел одинаковой 9X_pythonista длины. Некоторые значения могут быть нулевыми. Я 9X_python-shell хотел бы получить еще два списка, в которых 9X_py не только отсутствуют нулевые элементы, но 9X_pythonista и удалены те элементы, которые являются 9X_pythonista нулевыми в другом списке.

Например, если 9X_py у меня есть

l1 = [0, 1, 3, 0, 6, 0, 8, 0]
l2 = [4, 7, 0, 0, 8, 9, 1, 2]

Хочу получить

nz1 = [1, 6, 8]
nz2 = [7, 8, 1]

Очевидно, что в 9X_pythonic Python есть много способов сделать это, но 9X_python-shell какой из них самый элегантный? Поскольку 9X_python списки короткие, меня не волнует самый быстрый 9X_pythonista способ. Скорость не важна. Я ищу хорошо 9X_python-shell читаемый код. Возможно использование стандартных 9X_python библиотек Python, а не дополнительных, как 9X_pythonista numpy.

2
0
2
Общее количество ответов: 2

Ответ #1

Ответ на вопрос: Как удалить «нули» параллельно из двух списков в Python?

out1, out2 = zip(*filter(all, zip(l1, l2)))

> out1
(1, 6, 8)

> out2
(7, 8, 1)

Этот однострочник относительно эффективен, так 9X_python-shell как использует генераторы, но возвращает 9X_pythonista кортежи, вы можете впоследствии преобразовать 9X_python их в списки, если вам действительно нужно:

> list(out1)
[1, 6, 8]

Идея 9X_python здесь в том, что мы используем zip для перебора 9X_python-shell пар значений из двух параллельных списков. Это 9X_python-interpreter дает нам поток пар. Затем мы используем 9X_python-shell filter для удаления значений из потока — функция 9X_python-shell all вернет False, если какие-либо значения в паре 9X_pythonic являются «ложными», то есть когда одно или 9X_pythonic оба значения равны 0. Наконец, мы используем 9X_pythonic трюк zip(*), чтобы «распаковать» наш отфильтрованный 9X_pythonista zip-поток обратно в две отдельные последовательности.

См.:

12
0

Ответ #2

Ответ на вопрос: Как удалить «нули» параллельно из двух списков в Python?

Это хорошая проблема для решения. На самом 9X_python-shell деле вы можете zip еще два списка, и это даст 9X_python-interpreter вам кортеж каждого элемента

l1 = [0, 1, 3, 0, 6, 0, 8, 0]
l2 = [4, 7, 0, 0, 8, 9, 1, 2]

nz1 = []
nz2 = []
for x, y in zip(l1, l2):
  if x != 0 and y != 0:
    nz1.append(x)
    nz2.append(y)

print(nz1)
print(nz2)

Вывод:

[1, 6, 8]
[7, 8, 1]

Обновление: на 9X_py всякий случай, если кто-то хочет получить 9X_py однострочник

nz1, nz2 = map(list, zip(*filter(all, zip(l1, l2))))

2
0