Listen in Variablen umformen

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
Poirot
User
Beiträge: 7
Registriert: Mittwoch 15. Juni 2016, 19:45

Hallo zusammen,

Mein Ziel ist es eine einzige Zahl durch alle Elemente der Liste zu teilen.(einzeln):
123456 / 1 = ...
123456 / 2 = ...
usw.

ich möchte gerne in einer Liste wie zum Beispiel:
Liste = [1,2,3,4,5]

das hier machen:
a = 1
und im nächsten durchlauf einer while schleife:
a = 2
Die liste muss allerdings gleich bleiben oder am ende wieder wie am anfang sein.

LG Poirot
BlackJack

@Poirot: Und das konkrete Problem dabei ist jetzt welches? Was hast Du gemacht? Gab es Fehlermeldungen? Falls ja, welche? Tracebacks und Code bitte 1:1 zeigen. Oder verhält sich Dein Code nicht so wie Du erwartest? Falls ja, was erwartest Du und was bekommst Du stattdessen?

Also entweder beschreibst Du nicht das was wirklich passieren soll, oder Du solltest dringend mal das Tutorial in der Python-Dokumentation durcharbeiten und etwas über Schleifen lernen.
Poirot
User
Beiträge: 7
Registriert: Mittwoch 15. Juni 2016, 19:45

@BlackJack war vielleicht etwas schlecht formuliert. Das hier ist mein Programm an sich(die form ist nicht perfekt aber so habe ich es mir angewöhnt.):

Code: Alles auswählen

#Definitionen---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
def haelfte_gerade(Zahl):
    Zahl = Zahl / 2
    
    if Zahl % 1 == 0:
        t = Zahl
        
    else:
        t = Zahl + 0,5
    Zahl = Zahl * 2 
#Definitionen---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    
#Listen---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Liste = []
Liste2 = []
Liste3 = []
#Listen---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

#Text-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
while 1:
#Variabeln------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    t = 0
    v = 0
    l = 0
    k = 2
    umpsa = 1
#Variabeln------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    
    xx = input("Welche Zahl soll geprüft werden?(Max: 1.000.000.000.000): ")
    if xx == "Liste":
        print("Die bisher gefundenen Primzahlen sind:")
        print(Liste3)
        print("-")
        print("-")
        umpsa = 0
    if xx == "":
        print("Du musst schon was eingeben ;)")
        print("-")
        print("-")
        umpsa = 0
    if umpsa == 1:
        x = float(xx)

#Secure Tests---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    if umpsa == 1:
        if x == 0:
            print("0 ist keine Primzahl.")
            print("-")
            print("-")
            umpsa = 0
        if x < 0:
            print("Die Zahl darf nicht negativ sein")
            print("-")
            print("-")
            umpsa = 0
        if x > 1000000000000:
            print("Die Zahl ist zu groß!(Größer 1.000.000.000.000)")
            print("-")
            print("-")
            umpsa = 0
        if umpsa == 1:
            if x % 1 == 0:
                x = x
            else:
                print("Die Zahl darf keine Kommazahl sein!")
                print("-")
                print("-")
                umpsa = 0
#Secure Tests---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    

    if umpsa == 1:
        x = int(x)
        v = x
        haelfte_gerade(v)
        while x > k:
            
            if x % k == 0:
                print(x," ist keine Primzahl.")
                print("Der kleinste Teiler ist: ",k)
                print("-")
                print("-")
                l = 1
                break

            k = k + 1
        if l == 1:
            l = 1
        else:
            print(x,"ist eine Primzahl.")
            print("-")
            print("-")
            for e in Liste:
                if e not in Liste2:
                    Liste3.append(e)
                    Liste2.append(e)
            Liste.append(x)
#Text-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Was ich nun tun will ist an dieser stelle:

Code: Alles auswählen

if x % k == 0:
                print(x," ist keine Primzahl.")
                print("Der kleinste Teiler ist: ",k)
                print("-")
                print("-")
                l = 1
                break

            k = k + 1
        if l == 1:
            l = 1
        else:
            print(x,"ist eine Primzahl.")
            print("-")
            print("-")
            for e in Liste:
                if e not in Liste2:
                    Liste3.append(e)
                    Liste2.append(e)
            Liste.append(x)
Da alle kleinsten Teiler einer nicht Primzahl Primzahlen sind möchte ich auch nuir durch Primzahlen teilen um Zeit zu sparen. Da dieses Programm ja sowieso Primzahlen herausfindet wollte ich mir das zu nutze machen und die Zahl schon mal durch alle zuvor herausgefundenen Primzahlen teilen die in der Liste 3 aufgelistet sind. allerdings kann ich ja nicht durch Listen teilen und suche nun nach einer möglichkeit die Elemente der Liste irgentwie zu separieren und dann durch sie zu teielen.
Zuletzt geändert von Anonymous am Freitag 10. Februar 2017, 14:02, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Poirot: wenn Du etwas Dir angewöhnt hast, dann solltest Du versuchen Deine Gewohnheiten zu ändern. Definitionen erkennt man daran, dass sie mit def anfangen. Ein ordentliches Skript besteht fast nur aus Definitionen, so dass dieser Kommentar reichlich überflüssig ist. Wie die ganzen anderen Trennzeilen auch, die nur den Lesefluß behindern und für Verwirrung sorgen (was ist Text?) Eine Funktion, die kein Ergebnis hat (haelfte_gerade) ist überflüssig, kann also weg. t wird zwar nicht verwendet, trotzdem sollte man an eine Variable nur Werte eines Typs binden (und nicht mal eine Zahl, mal ein Tuple). Müßte ich raten, sollte die Funktion so aussehen:

Code: Alles auswählen

def ceiling_to_even(number):
    return (number + 1) & ~1
Alles ab Zeile 13 sollte auch in Funktionen (Mehrzahl ist absicht) gepackt werden. Variablennamen sollten sprechend sein. Was man mit Liste, Liste2 oder Liste3 anfängt, ist absolut unklar. Zeile 20: Endlosschleifen schreibt man als "while True:". Einbuchstabige Variablennamen sind generell nichtssagend. l sollte erst gar nicht verwendet werden (Verwechslungsgefahr mit 1, I, etc.). Abkürzungen (umpsa?) vermeiden. Die nachfolgenden if-Abfragen sind ungeschickt. Es gibt elif und else, so dass ein Flag (umpsa) unnötig ist. Wenn Du keine Kommazahlen willst, warum verwendest Du dann float? Zeile 75: kann weg. Das l-Flag wird erst ab Zeile 76 benutzt, aber schon in Zeile 24 initialisiert. Variablen erst initialisieren, wenn sie auch gebraucht werden. Das Flag kann man sich sparen, wenn die while-Schleife in eine Funktion wandert.
Zum Problem: Du kennst for-Schleifen?
Poirot
User
Beiträge: 7
Registriert: Mittwoch 15. Juni 2016, 19:45

@sirius3 Erstmal danke für den tipp mit den for schleifen hab gar nicht daran gedacht xD

Was die Definition angeht, die benutze ich damit alle Zahlen nur bis zu ihrer hälfte geteilt werden müssen.
Ich benutze die float da es bei int eine Fehlermeldung gibt wenn man Kommazahlen eingibt.
Und ansonsten habe ich ja gesagt das die form nicht perfekt ist aber für mich wird es dadurch besser und übersichtlicher.
Das while 1: und andere dinge habe ich noch aus anderen Programmiersprachen.
BlackJack

@Poirot: Die „Definition“ ist eine *Funktion* und die benutzt Du gar nicht. Du rufst sie zwar auf, aber das ist völlig sinnlos weil es ausser ein ganz klein wenig Rechenzeit zu verbrauchen keinerlei Effekt hat.

Es gibt auch bei `float()` eine Fehlermeldung wenn der Benutzer Beispielsweise 'Hallo' eingibt, statt einer Zahl. Deswegen verwendet man trotzdem `int()` wenn man eine ganze Zahl haben möchte. Und kümmert sich dann entsprechend um die Ausnahme die ausgelöst wird wenn das Argument nicht in eine ganze Zahl umgewandelt werden kann.

Die Namensgebung wäre auch in anderen Programmiersprachen nicht akzeptabel. Ausser wir reden hier von so etwas wie BASIC auf 8-Bit-Heimrechnern, wo viele Dialekte beispielsweise auf maximal zwei Buchstaben für Variablennamen beschränkt waren. ;-)

Was die Form ansonsten angeht, sollte man sich an das halten was Leser erwarten wenn man Code veröffentlicht. Je ungewohnter und schwieriger lesbar das für Python-Programmierer ist, die sich an die Konventionen halten, desto unwahrscheinlicher wird es das sich da jemand durchkämpft und Fehler sucht/findet.
Antworten