2010-07-21 4 views
0

Hey, je tentais de supprimer un élément formant une liste (sans utiliser set):Suppression d'un élément dans une liste

list1 = [] 
for i in range(2,101): 
    for j in range(2,101): 
     list1.append(i ** j) 
list1.sort() 
for k in range(1,len(list1) - 1): 
    if (list1[k] == list1[k - 1]): 
     list1.remove(list1[k]) 
print "length = " + str(len(list1)) 

La fonction set fonctionne très bien, mais je veux appliquer cette méthode. Sauf que je reçois:

IndexError: list index out of range 

sur la déclaration:

if (list1[k] == list1[k - 1]): 

Edité pour ajouter (Merci à Ned Batchelder) le code de travail est:

list1 = [] 
for i in range(2,101): 
for j in range(2,101): 
    list1.append(i ** j) 
list1.sort() 
k = 0 
while k < len(list1) - 1: # while loop instead of for loop because "The range function is evaluated once before the loop is entered" 
k += 1 
if (list1[k] == list1[k - 1]): 
    list1.remove(list1[k]) 
    list1.sort() 
    k -= 1 # "If you find a duplicate, you don't want to move onto the next iteration, since you'll miss potential runs of more than two duplicates" 
print "length = " + str(len(list1)) 
+2

Je ne suis pas sûr de ce que vous demandez - quel ensemble fonction? Que voulez-vous dire, "appliquer cette méthode?" –

+2

Je pense qu'il ne veut pas avoir de doublons dans sa liste. –

+0

L'objet 'set', comme dans' s = ensemble ([2, 2, 3, 4]) 'Je pense :) Est-ce devoir? – cji

Répondre

5

Votre code ne fonctionne pas car dans votre boucle, vous parcourez tous les index de la liste d'origine, mais en raccourcissant la liste au fur et à mesure. A la fin de l'itération, vous allez accéder à des indices qui n'existent:

for k in range(1,len(list1) - 1): 
    if (list1[k] == list1[k - 1]): 
     list1.remove(list1[k]) 

La fonction range est évaluée une fois avant que la boucle est saisie, la création d'une liste de tous les index dans la liste. Chaque appel à remove raccourcit la liste de un, si vous supprimez des éléments, vous êtes sûr d'obtenir votre erreur à la fin de la liste.

Si vous souhaitez utiliser une boucle comme cela, essayez:

k = 1 
while k < len(list1): 
    if list1[k] == list1[k-1]: 
     del list1[k] 
    else: 
     k += 1 

Je fixe quelques autres choses:

  1. Vous n'avez pas besoin entre parenthèses autour de la condition en Python si les déclarations.
  2. Si vous trouvez un doublon, vous ne voulez pas passer à l'itération suivante, car vous risquez de manquer des exécutions potentielles de plus de deux doublons.
  3. Vous voulez commencer à partir de l'index 1, pas zéro, puisque k = 0 accédera à list1 [-1].
+0

- « La fonction de gamme est évaluée une fois avant que la boucle est entrée » et « Si vous trouvez un doublon, vous ne voulez pas passer à l'itération suivante, puisque vous allez manquer pistes potentielles de plus de deux doublons. » que la réponse que je cherchais, merci! –

2

lieu de supprimer des éléments Écrivez une liste de compréhension des choses que vous voulez en t La nouvelle liste:

list1[:] = [list1[k] for k in range(1,len(list1) - 1) 
        if not list1[k] == list1[k - 1] ] 

Votre méthode se brise parce que vous supprimez des éléments de la liste. Lorsque vous faites cela, la liste devient plus courte et l'itération de la boucle suivante a ignoré un élément. Disons que vous regardez k = 0 et L = [1,2,3]. Vous supprimez le premier élément, alors L = [2,3] et le k suivant = 1. Donc vous regardez L [1] qui est 3 - vous avez sauté les 2!

Alors: Ne jamais changer la liste que vous itérer sur

+0

C'est une méthode réussie, mais pourquoi la mienne ne fonctionne pas? –

3

Il semble que si vous essayez de uniquify une liste (clarification serait génial) alors jetez un oeil ici: http://www.peterbe.com/plog/uniqifiers-benchmark

Il est aussi cette question ici sur le SO: In Python, what is the fastest algorithm for removing duplicates from a list so that all elements are unique *while preserving order*?

+0

C'est bien de tout avoir en un seul endroit, marqué d'un signet. – cji

+0

unique et régler le travail très bien, ma question est: Quel est le problème avec mon code? –

1

Vous pouvez utiliser del:

l = [1, 2, 3, 4] 
del l[2] 
print l 
[1, 2, 4] 
+0

Pourquoi un -1? Je n'aurais peut-être pas compris la question en premier lieu? –

+0

del et list1.remove sont identiques. Le problème n'est pas là! –

Questions connexes