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)
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:
X
mais de uma vez. Isso é redundante.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
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP