it-roy-ru.com

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

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

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

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

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

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

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

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

Это удалит первый случай, соответствующий строке.

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

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

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

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

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

10
Ron Kalian

Разумный способ сделать это состоит в использовании 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(), которые предоставляют списки, а не массивы. Не то же самое.

3
pillmuncher

Ваш цикл for неправильный, если вам нужен индекс в цикле for:

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

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

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

2
MatthieuW

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

Мы начинаем с 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']
0
jpp