Как удалить определенный элемент из массива с помощью python

Я хочу написать что-то, что удаляет определенный элемент из массива. Я знаю, что я должен for цикл по массиву, чтобы найти элемент, соответствующий контент.

Скажем, у меня есть массив писем, и я хочу избавиться от элемента, который соответствует некоторой строке электронной почты.

Мне бы хотелось использовать структуру for loop, потому что мне нужно использовать тот же индекс для других массивов.

Вот код, который у меня есть:

for index, item in emails:
    if emails[index] == '[email protected]':
         emails.pop(index)
         otherarray.pop(index)

Ответ 1

Вам не нужно перебирать массив. Просто:

>>> x = ['[email protected]', '[email protected]']
>>> x
['[email protected]', '[email protected]']
>>> x.remove('[email protected]')
>>> x
['[email protected]']

Это приведет к удалению первого события, соответствующего строке.

EDIT: после редактирования вам все равно не нужно перебирать. Просто делать:

index = initial_list.index(item1)
del initial_list[index]
del other_list[index]

Ответ 2

Использование filter() и lambda обеспечит аккуратный и точный метод удаления нежелательных значений:

newEmails = list(filter(lambda x : x != '[email protected]', emails))

Это не изменяет электронные письма. Он создает новый список newEmails, содержащий только те элементы, для которых анонимная функция вернула True.

Ответ 3

Простой способ сделать это - использовать zip() и выражение для представления/генерации списка:

filtered = (
    (email, other) 
        for email, other in zip(emails, other_list) 
            if email == '[email protected]')

new_emails, new_other_list = zip(*filtered)

Кроме того, если вы не используете array.array() или numpy.array(), то, скорее всего, вы используете [] или list(), которые дают вам списки, а не массивы. Не то же самое.

Ответ 4

Ваш цикл for не подходит, если вам нужен индекс в цикле for:

for index, item in enumerate(emails):
    # whatever (but you can't remove element while iterating)

В вашем случае решение Богдана в порядке, но выбор структуры данных не так хорош. Необходимость поддерживать эти два списка с данными из одного, связанного с данными другого, с одним и тем же индексом является неуклюжей.

Список туферов (email, otherdata) может быть лучше, или dict с ключом электронной почты.

Ответ 5

Существует альтернативное решение этой проблемы, которое также касается дублирующих совпадений.

Мы начинаем с 2 списков одинаковой длины: emails, otherarray. Цель состоит в том, чтобы удалить элементы из обоих списков для каждого индекса i где emails[i] == '[email protected]'.

Это может быть достигнуто с использованием понимания списка, а затем расщепления через zip:

emails = ['[email protected]', '[email protected]', '[email protected]']
otherarray = ['some', 'other', 'details']

from operator import itemgetter

res = [(i, j) for i, j in zip(emails, otherarray) if i!= '[email protected]']
emails, otherarray = map(list, map(itemgetter(0, 1), zip(*res)))

print(emails)      # ['[email protected]', '[email protected]']
print(otherarray)  # ['some', 'details']