for x in y <<Überspringt listen Eintrag!!

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Iopodx
User
Beiträge: 68
Registriert: Sonntag 5. September 2004, 08:58

Hiho Gemeinde!

Ich habe folgenden Code:

Code: Alles auswählen

from math import sqrt
from time import time
def sieb(count):
    result=[]
    times=[time(), 0, 0]
    for current in range(3, count, 2):
        if current%3!=0 and current%5!=0:
            result.append(current)
    print result
    b=0
    for current in result:
        print current
        for i in range(7, current, 2):
            if current%i==0:
                result.pop(b)
        b+=1
                        
    times[1]=time()
    times[2]=times[1]-times[0]
    return [times[2], [2, 3, 5]+result, len([2, 3, 5]+result)]

print sieb(100)[1]
So weit, so gut. Der Haken an der Sache ist, das result u.a. eine 79 enthält. Jedoch wird jene NICHT in der for Schleife berücksichtigt! Führt einfach mal den Script aus, und ihr werdet sehehn was ich meine!

Weiß einer warum das so ist, und vor Allem, wie ich das beheben kann?

Danke schonmal im vorraus!

MfG
Iopodx

PS: Soll übrigens mal das "Sieb des Erasthosthenes" werden, bzw. ähnlich dem Sieb, nur weiß ich leider nicht ob es geht wenn diverse Zahlen übersprungen werden!?
joe

Hi
Iopodx hat geschrieben: Weiß einer warum das so ist, und vor Allem, wie ich das beheben kann?
Warum debuggst du den code nicht an der entscheidenen stelle also beim pop()-aufruf?

Code: Alles auswählen

for current in result:
        print current
        print result
        for i in range(7, current, 2):
            if current%i==0:
                print i
                result.pop(b)
                #break
        b+=1
        print result

#Ausgabe:
#[7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 77, 79, 83, 89, 91, 97]
#[7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 77, 79, 83, 89, 91, 97]
#77
#[7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 77, 79, 83, 89, 91, 97]
#7
#11
#[7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 83, 89, 91, 97]
#89


Dann siehst du daß für current gleich 77 pop() 2mal aufgerufen wird. Hab keinen schimmer worum es einklich geht, aber das scheint mir nicht gewollt zu sein. Mit dem break nach dem pop sieht es imo besser aus.
joe
Iopodx
User
Beiträge: 68
Registriert: Sonntag 5. September 2004, 08:58

joe hat geschrieben:Hi
Iopodx hat geschrieben: Weiß einer warum das so ist, und vor Allem, wie ich das beheben kann?
Warum debuggst du den code nicht an der entscheidenen stelle also beim pop()-aufruf?

Code: Alles auswählen

for current in result:
        print current
        print result
        for i in range(7, current, 2):
            if current%i==0:
                print i
                result.pop(b)
                #break
        b+=1
        print result

#Ausgabe:
#[7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 77, 79, 83, 89, 91, 97]
#[7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 77, 79, 83, 89, 91, 97]
#77
#[7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 77, 79, 83, 89, 91, 97]
#7
#11
#[7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 83, 89, 91, 97]
#89


Dann siehst du daß für current gleich 77 pop() 2mal aufgerufen wird. Hab keinen schimmer worum es einklich geht, aber das scheint mir nicht gewollt zu sein. Mit dem break nach dem pop sieht es imo besser aus.
joe
Ich weiß zwar nicht warum, aber es geht :) Danke!
fs111
User
Beiträge: 170
Registriert: Samstag 15. November 2003, 11:42
Kontaktdaten:

Wenn Du pop auf einer Liste ausführst, über die du gerade iterierst, sägst Du quasi an dem Ast auf dem Du sitzt. Das sollte man nicht machen.

fs111
Pydoc-Integration in vim - Feedback willkommen: http://www.vim.org/scripts/script.php?script_id=910
Antworten