Seite 1 von 1

Listenproblem

Verfasst: Montag 16. April 2012, 13:31
von tany3
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 ?

Re: Listenproblem

Verfasst: Montag 16. April 2012, 13:39
von BlackJack
@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`.

Re: Listenproblem

Verfasst: Montag 16. April 2012, 13:42
von tany3
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

Re: Listenproblem

Verfasst: Montag 16. April 2012, 13:45
von EyDu
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

Re: Listenproblem

Verfasst: Montag 16. April 2012, 13:50
von BlackJack
@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.

Re: Listenproblem

Verfasst: Montag 16. April 2012, 20:55
von AlphaX2
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

Re: Listenproblem

Verfasst: Montag 16. April 2012, 21:14
von cofi
Und als Einzeiler:

Code: Alles auswählen

print [int(raw_input('Zahl eingeben: ')) for _ in range(int(raw_input('Anzahl Zahlen: ')))]
;)

Re: Listenproblem

Verfasst: Montag 16. April 2012, 21:22
von AlphaX2
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

Re: Listenproblem

Verfasst: Dienstag 17. April 2012, 01:02
von Leonidas
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.

Re: Listenproblem

Verfasst: Dienstag 17. April 2012, 08:50
von /me
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.
[...]