TransWikia.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!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP