Como remover um elemento específico de uma matriz usando python

138

Eu quero escrever algo que remove um elemento específico de uma matriz. Eu sei que tenho que forpercorrer a matriz para encontrar o elemento que corresponde ao conteúdo.

Digamos que eu tenho uma matriz de emails e quero me livrar do elemento que corresponde a uma sequência de emails.

Na verdade, eu gostaria de usar a estrutura de loop for porque também preciso usar o mesmo índice para outras matrizes.

Aqui está o código que eu tenho:

for index, item in emails:
    if emails[index] == '[email protected]':
         emails.pop(index)
         otherarray.pop(index)
locoboy
fonte
6
Você está procurando list.remove(x)?
Jacob
não exatamente. eu gostaria de usar o loop para que eu possa reutilizar o índice
locoboy
4
Você não deve alterar a lista ao iterá-la.
Jacob
por que não devo fazer isso? Também não está funcionando para mim.
locoboy

Respostas:

200

Você não precisa iterar a matriz. Somente:

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

Isso removerá a primeira ocorrência que corresponde à sequência.

EDIT: Após a sua edição, você ainda não precisa repetir. Apenas faça:

index = initial_list.index(item1)
del initial_list[index]
del other_list[index]
Bogdan
fonte
1
veja acima eu gostaria de usar o loop for para reutilizar o mesmo índice
locoboy
Editou minha resposta. Ainda não há necessidade de loop.
Bogdan
1
Como você primeiro verifica se o item existe na lista_inicial? Pode haver um caso em que não existe e você não precisará removê-lo.
locoboy
17

Usar filter()e lambdaforneceria um método claro e conciso para remover valores indesejados:

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

Isso não modifica e-mails. Ele cria a nova lista newEmails contendo apenas elementos para os quais a função anônima retornou True.

Ron Kalian
fonte
5

Seu loop for não está correto, se você precisar do índice no uso do loop for:

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

No seu caso, a solução Bogdan é boa, mas sua escolha de estrutura de dados não é tão boa. Ter que manter essas duas listas com dados de um relacionado a dados do outro no mesmo índice é desajeitado.

Uma lista de tupple (email, outros dados) pode ser melhor ou um ditado com email como chave.

MatthieuW
fonte
4

A maneira sensata de fazer isso é usar zip()uma Expressão de Compreensão / Gerador de Lista:

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

new_emails, new_other_list = zip(*filtered)

Além disso, se your'e não usar array.array()ou numpy.array(), então provavelmente você está usando []ou list(), o que dará listas, não Arrays. Não é a mesma coisa.

pillmuncher
fonte
1
Ninguém sabe ao certo como isso é "sensato" em comparação com a resposta de @ Bogdan, que é muito, muito mais limpa.
Jordan Lapp
Obrigado por apontar que as matrizes não são iguais às listas. A resposta selecionada não funciona em matrizes no 2.7.
EL_DON
2

Existe uma solução alternativa para esse problema que também lida com correspondências duplicadas.

Começamos com 2 listas de igual comprimento: emails, otherarray. O objetivo é remover itens de ambas as listas para cada índice em ique emails[i] == '[email protected]'.

Isso pode ser conseguido usando uma compreensão de lista e depois dividindo-se através de 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']
jpp
fonte