Удалить такие же позиции элементов в другом массиве

подскажите пожалуйста как удалить такие же позиции элементов в другой массиве. Например у меня есть 2 массива:

a = [12, 58, 'слово', 37, 'второе']
b = [1, 2, 3, 4, 5]

Я удаляю в первом массиве все элементы str:

a = [x for x in a if type(x) != str]

Далее я хочу удалить такие же позиции во втором массиве. То есть например str было на 2 и 4 позициях, как мне удалить такие же позиции во втором массиве? Чтобы получилось:

b = [1, 2, 4]

Ответы (5 шт):

Автор решения: n1tr0xs

Варинт 1:

a = [12, 58, 'слово', 37, 'второе']
b = [1, 2, 3, 4, 5]
indexes = [i for i in range(len(a)) if type(a[i])==str]
a = [x for x in a if type(x) != str]
b = [b[i] for i in range(len(b)) if i not in indexes]

Тут всё работает даже со списками разной длины.


Вариант 2:

a = [12, 58, 'слово', 37, 'второе']
b = [1, 2, 3, 4, 5]

new_a = []
new_b = []
for i in range(len(a)):
    if type(a[i]) != str:
        new_a.append(a[i])
        new_b.append(b[i])

Тут если список b меньше - ждите IndexError, зато работает быстрее, можно так "починить"

a = [12, 58, 'слово', 37, 'второе']
b = [1, 2, 3, 4, 5]

new_a = []
new_b = []
for i in range(len(a)):
    if type(a[i]) != str:
        new_a.append(a[i])
        try:
            new_b.append(b[i])
        except IndexError:
            pass
→ Ссылка
Автор решения: nomnoms12

Между вашими данными прямая взаимосвязь. Поэтому я предварительно объединил бы их с помощью функции zip:

a = [12, 58, 'слово', 37, 'второе']
b = [1, 2, 3, 4, 5]

enumerated = zip(b, a)                         # [(1, 12), (2, 58), (3, 'слово'), (4, 37), (5, 'второе')]
function = lambda pair: type(pair[1]) != str
filtered = list(filter(function, enumerated))  # [(1, 12), (2, 58), (4, 37)]

a = [x[0] for x in filtered]
b = [x[1] for x in filtered]

print(a, b, sep='\n')

stdout:

[1, 2, 4]
[12, 58, 37]
→ Ссылка
Автор решения: Namerek
from itertools import compress

a = [12, 58, 'слово', 37, 'второе']
b = [1, 2, 3, 4, 5]

condition = lambda x: not isinstance(x, str)

pat = list(map(condition, a))

a = list(compress(a, pat))
b = list(compress(b, pat))

print(
    a,
    b,
    sep='\n'
)
# [12, 58, 37]
# [1, 2, 4]
#
→ Ссылка
Автор решения: Andy Pavlov

В дополнение к вариантам коллег по Stack) Можно в лоб пройтись по двум спискам с помощью range(n), где n — минимальная из длин двух списков. Дальше сравниваем тип переменной в списке a со строкой и добавляем в результирующий список.

a = [12, 58, 'слово', 37, 'второе']
b = [1, 2, 3, 4, 5]

res = []
for ie in range(min(len(a), len(b))):       
    res.append(b[ie]) if not isinstance(a[ie], str) else None
→ Ссылка
Автор решения: Stanislav Volodarskiy

zip чтобы склеить списки в пары, фильтрация, zip что бы расклеить пары обратно:

a = [12, 58, 'слово', 37, 'второе']
b = [1, 2, 3, 4, 5]

a, b = zip(*((ia, ib) for ia, ib in zip(a, b) if not isinstance(ia, str)))

print(a, b, sep='\n')
(12, 58, 37)
(1, 2, 4)

Преобразование можно записать так:

a, b = zip(*(p for p in zip(a, b) if not isinstance(p[0], str)))

Или так:

a, b = zip(*filter(lambda p: not isinstance(p[0], str), zip(a, b)))

P.S. type(x) != str не рекомендуется. not isinstance(x, str) - ОК.

→ Ссылка