2017-04-15 1 views
1

J'essaie d'apprendre Python, mais je suis encore assez jeune. J'essaye de créer une liste de nombres de 2 jusqu'au nombre que l'utilisateur entrera et parcourra la liste et enlèvera tous les nombres non premiers de cette liste, puis l'imprimera dehors. J'ai du mal à calculer car je continue d'avoir l'erreur: l'index de la liste est hors limites. J'envisageais d'utiliser une boucle for, mais la variable i serait plus basse que le courant variable et je dois m'assurer que i est toujours plus haut que le courant quand il traverse la liste. Je suis seulement autorisé à utiliser des fonctions de base et des boucles pour la tâche.Création d'une liste de Primes et impression de la liste en Python 3.6.1

counter = 2 

current = 2 

n = int(input("Please enter a number larger than 2. ")) 

while counter <= n: 
    userList.append(counter) 
    counter = counter + 1 

print("Printing out list ") 
print(userList) 

i = 1 

while i <= len(userList): 
    if userList[ i ] % current == 0: 
     userList.remove(userList[i]) 
     i = i + 1 
    else: 
     current = current + 1 

print(userList) 

Répondre

0

Il y a quelques erreurs dans votre code.

1) Supprimer de la grande liste est très lent, car vous devez tout déplacer après l'élément qui a été supprimé pour éviter tout écart entre les éléments de la liste. Il est préférable de marquer l'élément comme étant supprimé, puis d'imprimer ce qui reste à l'intérieur.

2) En utilisant votre algorithme, vous avez besoin de deux boucles while.

3) Si vous avez une liste avec N éléments, le dernier index de la liste est (N-1).

solution Plus Pythonic:

#!/usr/bin/env python3 

n = int(input("Maximal number: ")) 
numbers = list(range(2, n+1)) 

i = 0 
while i < len(numbers): 
    if numbers[i] != None: 
     j = i + 1 
     while j < len(numbers): 
      if numbers[j] != None: 
       if numbers[j] % numbers[i] == 0: 
        numbers[j] = None 
      j += 1 
    i += 1 

print(list(filter(lambda x: x is not None, numbers)))` 
+0

Je comprends. La tâche me permet seulement d'utiliser des boucles et des fonctions de base. L'utilisation de mots-clés tels que filter et lambda n'est pas autorisée. Je ne sais même pas ce qu'ils font. Fondamentalement, je suis seulement autorisé à utiliser ce que j'ai dans mon code, ce n'est tout simplement pas correct. –

+0

Fondamentalement, vous venez de créer une nouvelle liste à partir de valeurs qui ne sont pas marqués comme étant supprimés. Vous pouvez facilement le réécrire comme un pour la boucle et si la déclaration. – gcx11