Удалить такие же позиции элементов в другом массиве
подскажите пожалуйста как удалить такие же позиции элементов в другой массиве. Например у меня есть 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 шт):
Варинт 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
Между вашими данными прямая взаимосвязь. Поэтому я предварительно объединил бы их с помощью функции 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]
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]
#
В дополнение к вариантам коллег по 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
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) - ОК.