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] == 'something@something.com':
         emails.pop(index)
         otherarray.pop(index)

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 = ['ala@ala.com', 'bala@bala.com']
>>> x
['ala@ala.com', 'bala@bala.com']
>>> x.remove('ala@ala.com')
>>> x
['bala@bala.com']

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]

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 != 'something@something.com', 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.


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.


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 == 'something@something.com')

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.


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] == 'something@something.com'.

Isso pode ser conseguido usando uma compreensão de lista e depois dividindo-se através de zip:

emails = ['abc@def.com', 'something@something.com', 'ghi@jkl.com']
otherarray = ['some', 'other', 'details']

from operator import itemgetter

res = [(i, j) for i, j in zip(emails, otherarray) if i!= 'something@something.com']
emails, otherarray = map(list, map(itemgetter(0, 1), zip(*res)))

print(emails)      # ['abc@def.com', 'ghi@jkl.com']
print(otherarray)  # ['some', 'details']
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.