AnswerBun.com

Como excluir elementos negativos de uma lista e adicionar-los em outra em python?

Stack Overflow em Português Asked by omathevs on November 9, 2020

tentei com esse código mas não funciona com precisão

from random import randint

lista=10
X=list(range(lista))
R=[]

def gravarLista(X):
    for i in range(lista):
        X[i]=randint(-5, 5)
    print(X)
    for i in X:
        if i<0:
            X.pop(i)
            R.append(i)
    print(X)
    print(R)

gravarLista(X)

2 Answers

Conforme explicado aqui, aqui e aqui, remover elementos de uma lista no mesmo loop que itera sobre ela pode causar problemas e não funciona em todos os casos (teste o código da outra resposta - a primeira versão - com uma lista como [-1, -2, -3, -4, -5, 1, 2, 3] e veja que ela não remove todos os negativos).

A documentação dá algumas alternativas para resolver isso. Uma delas é simplesmente criar outra lista com o que você precisa. No caso, podemos criar 2 listas, uma somente com os positivos e outra somente com os negativos:

def separar_negativos(numeros):
    negativos = []
    positivos = []
    for i in numeros:
        if i < 0:
            negativos.append(i)
        else:
            positivos.append(i)
    # retorna as 2 listas
    return positivos, negativos

from random import choices

tamanho = 10
numeros = choices(range(-5, 6), k=tamanho)
print(numeros)

positivos, negativos = separar_negativos(numeros)
print(positivos)
print(negativos)

Repare também que usei random.choices para gerar a lista de números aleatórios, e usei range(-5, 6) (números entre -5 e 5, já que o valor final não é incluso - fiz assim para ficar compatível com randint(-5, 5), que inclui o 5 entre os valores possíveis) - choices está disponível a partir do Python 3.6.

Outro detalhe é que eu passo a lista de números como argumento da função, assim ela fica mais "genérica" - da maneira que você fez, ela é criada dentro da função e só funciona para aquela lista criada internamente. Fazendo da maneira acima, não importa como a lista é criada, a função separa os números negativos e positivos independente disso.

Answered by hkotsubo on November 9, 2020

Seu programa apresenta 3 problemas principais:

  1. Repare que você está preenchendo a lista X mais de uma vez. Isso é redundante.
  2. Você está iterando sobre uma lista e alterando ela ao mesmo tempo, e isso é perigoso. Tome cuidado ao usar esse artifício.
  3. Por fim, você usa a função pop() e passa como argumento um valor da lista, mas a função pop recebe como parâmetro um valor de index. Ou seja, ao fazer lista.pop(5) você não está apagando o valor 5, você está apagando o item localizado no index 5. Para resolver esse problema, eu utilizei a função lista.index(5). Essa função vai procurar o valor 5, que foi passado como argumento, dentro da lista lista e retornar seu index. Assim:
from random import randint

lista = 10
X = []
R = []

def gravarLista(X):
    for i in range(lista):
        X.append(randint(-5, 5))
    print(X)

    for i in X:
        if i < 0:
            R.append(i)
    print(R)

    for j in R:
        if j in X:
            X.pop(X.index(j))
    print(X)


gravarLista(X)

Answered by yoyo on November 9, 2020

Add your own answers!

Related Questions

Parar movimento com animation css

1  Asked on September 26, 2021 by jeanalves

   

Como executar uma paginação com PDO?

1  Asked on September 26, 2021

     

Implicações de @Autowired em construtor e fora

1  Asked on September 26, 2021 by daniela-morais

   

Menu Dropdown Responsivo

2  Asked on September 26, 2021 by user77295

     

Agrupar um array de objetos

3  Asked on September 26, 2021 by david-coelho

     

Sobrepor texto em uma imagem com flex box

1  Asked on September 26, 2021 by lopes-boa

     

TreeView com Nodes & Childs através de base de dados SQL

1  Asked on September 26, 2021 by diogo-costa

   

Erro ‘Método não-estático requer um destino.’

1  Asked on September 26, 2021 by caio-coutinho

     

Consulta de coleções firebase

1  Asked on September 26, 2021 by lima

         

useState não atualiza – ReactJS

3  Asked on September 26, 2021 by lucas-michel-da-silva

       

como incrementar um array de objeto javascript em loop?

1  Asked on September 26, 2021 by faillen

 

Adicionar character no fim da linha

3  Asked on September 26, 2021 by arcyde

   

Escala de serviço filtro de datas no plano de férias

1  Asked on September 26, 2021 by el-capitan-comandante

     

Problema ao validar input

1  Asked on September 26, 2021 by andr-cabral

   

“List Comprehensions” vale a pena?

2  Asked on September 26, 2021 by gui-reis

     

Ask a Question

Get help from others!

© 2022 AnswerBun.com. All rights reserved. Sites we Love: PCI Database, MenuIva, UKBizDB, Menu Kuliner, Sharing RPP, SolveDir