Agora eu sei que não é seguro modificar a lista durante um loop iterativo. No entanto, suponha que eu tenha uma lista de seqüências de caracteres e que eu queira desmontá-las. A substituição de valores mutáveis conta como modificação?
178
Respostas:
É considerado uma forma ruim. Em vez disso, use uma compreensão de lista, com atribuição de fatia, se precisar manter as referências existentes na lista.
fonte
print b
instrução é executada, você pode dizer sea
foi modificado no local e não substituído. Outra possibilidade seriaprint b is a
verificar se os dois ainda se referem ao mesmo objeto.Como o loop abaixo modifica apenas os elementos já vistos, seria considerado aceitável:
O que é diferente de:
na medida em que não requer a criação de uma lista temporária e uma atribuição para substituir a original, embora exija mais operações de indexação.
Cuidado: Embora você possa modificar as entradas dessa maneira, não é possível alterar o número de itens
list
sem arriscar a chance de encontrar problemas.Aqui está um exemplo do que quero dizer - excluir uma entrada atrapalha a indexação a partir desse ponto:
(O resultado está errado porque não excluiu todos os itens que deveria ter.)
Atualizar
Como esta é uma resposta bastante popular, veja como excluir efetivamente as entradas "no local" (mesmo que essa não seja exatamente a pergunta):
fonte
for i in a
? Isso é muito contra-intuitivo, aparentemente diferente de outros idiomas e resultou em erros no meu código que eu tive que depurar por um longo período de tempo. O Tutorial do Python nem sequer menciona isso. Embora deva haver alguma razão para isso?a[i]
es
) para o mesmo objeto na mesma linha quando você não precisa? Eu prefiro fazera[i] = a[i].strip()
.a[i] = s.strip()
apenas uma operação de indexação.enumerate(b)
faz uma operação de indexação em cada iteração e você faz outraa[i] =
. AFAIK é impossível implementar esse loop em Python com apenas 1 operação de indexação por iteração de loop :(Mais uma variante de loop, para mim parece mais limpa do que uma com enumerate ():
fonte
range(len(list))
no Python um cheiro de código.enumerate
é um gerador, não está criando uma lista. De tuplas, ele as cria uma de cada vez, conforme itera na lista. A única maneira de dizer qual é mais lento seriatimeit
.timeit
enumerate
é mais lentoModificar cada elemento durante a iteração de uma lista é bom, desde que você não altere a adição / remoção de elementos na lista.
Você pode usar a compreensão da lista:
ou apenas faça o
C-style
loop for:fonte
Não, você não alteraria o "conteúdo" da lista, se pudesse modificar as strings dessa maneira. Mas em Python eles não são mutáveis. Qualquer operação de string retorna uma nova string.
Se você tivesse uma lista de objetos que sabia que eram mutáveis, poderá fazer isso desde que não altere o conteúdo real da lista.
Assim, você precisará fazer um mapa de algum tipo. Se você usar uma expressão geradora, a [operação] será feita conforme você itera e você economiza memória.
fonte
Você pode fazer algo assim:
Isso se chama compreensão de lista, para facilitar o loop dentro de uma lista.
fonte
A resposta de Jemshit Iskenderov e Ignacio Vazquez-Abrams é realmente boa. Pode ser ilustrado com este exemplo: imagine que
a) Uma lista com dois vetores é fornecida a você;
b) você gostaria de percorrer a lista e reverter a ordem de cada uma das matrizes
Digamos que você tenha
Você vai ter
Por outro lado, se você fizer
O resultado é
fonte
Não está claro na sua pergunta quais são os critérios para decidir quais seqüências de caracteres remover, mas se você tiver ou puder fazer uma lista das cadeias que deseja remover, faça o seguinte:
que altera minhas_strings para ['a', 'c', 'e']
fonte
Em resumo, fazer modificações na lista enquanto itera a mesma lista.
exemplo:
fonte