Eu tenho que pesquisar uma lista e substituir todas as ocorrências de um elemento por outro. Até agora, minhas tentativas de código não me levaram a lugar algum, qual é a melhor maneira de fazer isso?
Por exemplo, suponha que minha lista tenha os seguintes números inteiros
>>> a = [1,2,3,4,5,1,2,3,4,5,1]
e preciso substituir todas as ocorrências do número 1 pelo valor 10, para que a saída que eu preciso seja
>>> a = [10, 2, 3, 4, 5, 10, 2, 3, 4, 5, 10]
Assim, meu objetivo é substituir todas as instâncias do número 1 pelo número 10.
Respostas:
fonte
Tente usar uma compreensão de lista e o operador ternário .
fonte
a
certo? Acho OP queriaa
mudara
deve sofrer uma mutação, mas (como mostra Alekhya) é trivial lidar com ambos os casos ao usar uma lista de compreensão.a
, deve fazê-loa[:] = [4 if x==1 else x for x in a]
(observe a fatia da lista completa). Basta fazer oa =
vai criar uma nova listaa
com um diferenteid()
(identidade) do originalA compreensão da lista funciona bem e o looping com o enumerate pode economizar um pouco de memória (porque basicamente a operação está sendo executada no local).
Há também programação funcional. Veja o uso do mapa :
fonte
lambda
emap
é considerado antitônico.Se você tiver vários valores para substituir, também poderá usar um dicionário:
fonte
n
não for encontradodic
?n
não for encontrada. Espero que você não se importe. Suatry/except
solução não foi boa.try-except
é pelo menos 50% mais rápido! Dê uma olhada nesta respostaif n in dic.keys()
é ruim em termos de desempenho. Useif n in dic
ordic.get(n,n)
(valor padrão)fonte
Você pode usar um loop for e ou while; no entanto, se você conhece a função Enumerar interna, é recomendável usar Enumerar. 1
fonte
Para substituir facilmente todos
1
com10
ema = [1,2,3,4,5,1,2,3,4,5,1]
um poderia usar a combinação lambda + mapa de uma linha seguinte, e 'Olha, Ma, há FI ou Fors!' :# This substitutes all '1' with '10' in list 'a' and places result in list 'c':
c = list(map(lambda b: b.replace("1","10"), a))
fonte
lambda
elemento em cada lista ...A seguir, é um método muito direto no Python 2.x
Este método funciona. Comentários são bem-vindos. Espero que ajude :)
Além disso, tente entender como Outis do e do damzam soluções trabalho. As compressões de lista e a função lambda são ferramentas úteis.
fonte
Em listas longas e ocorrências raras, o uso é cerca de 3x mais rápido
list.index()
- comparado aos métodos de iteração de etapa única apresentados nas outras respostas.fonte
Eu sei que essa é uma pergunta muito antiga e há inúmeras maneiras de fazer isso. O mais simples que encontrei está usando o
numpy
pacote.fonte
Meu caso de usuário foi substituído
None
por algum valor padrão.Eu cronometrei abordagens para esse problema que foram apresentadas aqui, incluindo a do @kxr - using
str.count
.Código de teste no ipython com Python 3.8.1:
Eu recebo:
Usar o interno
str.index
é de fato mais rápido do que qualquer comparação manual.Eu não sabia se a exceção no teste 4 seria mais trabalhosa do que em usar
str.count
, a diferença parece insignificante.Observe que
map()
(teste 6) retorna um iterador e não uma lista real, portanto, teste 7.fonte
Você pode simplesmente usar a compreensão da lista em python:
para o seu caso, onde você deseja substituir todas as ocorrências de 1 por 10, o snippet de código será assim:
fonte
Encontre e substitua apenas um item
fonte