Listenproblem

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
tany3
User
Beiträge: 20
Registriert: Mittwoch 7. März 2012, 10:32

Montag 16. April 2012, 13:31

Hey zusammen,

Ich hab ein Problem mit meiner Liste :

Code: Alles auswählen

while groesse > 0:
    groesse-=1
    eingabe = raw_input("Zahl eingeben:")
    liste.insert(0,eingabe)  

print liste
Das Problem ist , die Frage wird gestellt, ich gebe 5 als Größe des Arrays ein , tippe nacheinander 1,2,3,4,5 ein und er gibt mir die Liste aus :
Wieviele Zahlen wollen Sie eingeben ?5
Zahl eingeben:1
Zahl eingeben:2
Zahl eingeben:3
Zahl eingeben:4
Zahl eingeben:5
['5', '4', '3', '2', '1']
Aber direkt danach kommt noch einmal :
Zahl eingeben:
Und zwingt mich eine Eingabe zu machen ... Wieso ?
BlackJack

Montag 16. April 2012, 13:39

@tany3: Zeig bitte den ganzen Quelltext. Denn wenn man hier ``groesse = 5`` und ``liste = list()`` am Anfang ergänzt, dann kann ich zumindest das Problem nicht nachvollziehen.

Edit: Anstelle einer ``while``-Schleife würde man hier auch eher eine ``for``-Schleife verwenden, statt ``groesse`` manuell über das Programm verteilt zu verwalten.

Einfügen am Anfang einer Liste ist verhältnismässig ineffizient. Wenn das grössere Datenmengen werden, oder so etwas sehr häuffig aufgerufen wird, ist es in der Regel effizienter die Daten anzuhängen und am Ende die Liste umzudrehen. Oder man verwendet einen Datentypen bei dem man auch vorne effizient Elemente hinzufügen kann: `collections.deque`.
tany3
User
Beiträge: 20
Registriert: Mittwoch 7. März 2012, 10:32

Montag 16. April 2012, 13:42

BlackJack hat geschrieben:@tany3: Zeig bitte den ganzen Quelltext. Denn wenn man hier ``groesse = 5`` und ``liste = list()`` am Anfang ergänzt, dann kann ich zumindest das Problem nicht nachvollziehen.

Code: Alles auswählen

liste= []
groesse=input("Wieviele Zahlen wollen Sie eingeben ?")

while groesse > 0:
    groesse-=1
    eingabe = raw_input("Zahl eingeben:")
    liste.sort(liste.insert(0,eingabe))
 
    
print liste
EyDu
User
Beiträge: 4872
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Montag 16. April 2012, 13:45

Hallo.

Code: Alles auswählen

liste = []
while len(liste) < 5:
    liste.append(raw_input("Zahl eingeben"))

#da du die anzahl der durchlaeufe vorher kennst:
liste = []
for _ in range(5):
     liste.append(raw_input("Zahl eingeben"))
Du machst bei deinem Code noch ein paar Fehler: "groesse" ist ein sehr schlecht gewählter Name. Man würde erwarten, dass darin die aktuelle Größe der Liste gespeichert ist. Du machst aber genau das Gegenteil und "groesse" gibt an, wie viele Elemente noch zu speichern sind. Das ist sehr verwirrend. Hinzu kommt, dass du "groesse" von "liste" entkoppelst. Bei jedem Durchlauf musst du zwei Aktualisierungen durchführen. Wenn du einfach "len" verwendest, dann kannst du dadurch keine Fehler mehr produzieren und auf den ersten Blick sehen, was gemeint ist.

Wie ich gerade sehe, scheint dein Problem aber noch ein anderes zu sein: ich würde mal vermuten, da die Liste ausgegeben wird und das print außerhalb der Schleife steht, du noch eine Schleife um die Schleife herum hast. Sicherlich ist dort die Bedingung falsch.

Sebastian
Das Leben ist wie ein Tennisball.
BlackJack

Montag 16. April 2012, 13:50

@tany3: Wie gesagt, ich kann das Problem nicht nachvollziehen. Das Programm endet nach der Eingabe:

Code: Alles auswählen

bj@s8n:~$ python forum.py
Wieviele Zahlen wollen Sie eingeben ?5
Zahl eingeben:1
Zahl eingeben:2
Zahl eingeben:3
Zahl eingeben:4
Zahl eingeben:5
['1', '2', '3', '4', '5']
bj@s8n:~$
`input()` solltest Du nicht verwenden. Man kann da beliebige Python-Ausdrücke eingeben, die dann ausgewertet werden. So viel „Macht” möchte man Benutzern normalerweise nicht geben.

Dein `liste.sort()` Aufruf ist höchstgradig unsinnig mit *dem* Argument. Auch die Platzierung im Programmfluss ist ineffizient, denn es würde genügen nach der kompletten Eingabe die Liste *einmal* zu sortieren, statt sie für jede Eingabe zu sortieren. In dem Zusammenhang ist das ineffiziente Einfügen am Anfang der Liste ebenfalls unsinnig wenn sowieso sortiert wird.
AlphaX2
User
Beiträge: 53
Registriert: Dienstag 28. Juni 2011, 10:42

Montag 16. April 2012, 20:55

Ich glaube die Zahl der einzugebenden Zahlen sollte variabel sein, oder?
Im übrigen funktionierte der Code bei mir aber auch, wie BlackJack schon schrieb. :)

Ich würde es so lösen:

Code: Alles auswählen

liste = []
#raw_input ergibt Strings, also mit int umwandeln.
anzahlEingaben = int(raw_input("Wieviele Zahlen wollen Sie eingeben?"))

for i in range(anzahlEingaben):
    eingabe = raw_input("Zahl eingeben: ")
    liste.append(eingabe)

print liste
AlphaX2
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Montag 16. April 2012, 21:14

Und als Einzeiler:

Code: Alles auswählen

print [int(raw_input('Zahl eingeben: ')) for _ in range(int(raw_input('Anzahl Zahlen: ')))]
;)
AlphaX2
User
Beiträge: 53
Registriert: Dienstag 28. Juni 2011, 10:42

Montag 16. April 2012, 21:22

Für einen Anfänger dann aber vielleicht etwas schwieriger nachvollziehbar.
Aber stimmt, ginge auch als eine Zeile - kurz und bündig - Python eben. ^^

AlphaX2
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 17. April 2012, 01:02

AlphaX2 hat geschrieben:Ich würde es so lösen:

Code: Alles auswählen

liste = []
#raw_input ergibt Strings, also mit int umwandeln.
anzahlEingaben = int(raw_input("Wieviele Zahlen wollen Sie eingeben?"))

for i in range(anzahlEingaben):
    eingabe = raw_input("Zahl eingeben: ")
    liste.append(eingabe)

print liste
Ist zwar schon nicht schlecht, aber: "camelCase" sollte man sich nicht unbedingt angewöhnen und statt ``range`` würde man in Python 2.x ``xrange`` verwenden.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
/me
User
Beiträge: 3289
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Dienstag 17. April 2012, 08:50

AlphaX2 hat geschrieben:Für einen Anfänger dann aber vielleicht etwas schwieriger nachvollziehbar.
Aber stimmt, ginge auch als eine Zeile - kurz und bündig - Python eben. ^^
Man würde allerdings jemanden, der das tatsächlich so in Produktivcode einbaut, mit Dosenfleisch totwerfen.

Wie der BDFL in seiner Weisheit sagte, wird Code deutlich häufiger gelesen als geschrieben. Das Ziel muss es also sein, nicht nur lauffähigen, sondern auch gut lesbaren Code hervorzubringen.

Code: Alles auswählen

import this
[...]
Readability counts.
[...]
Antworten