Variablennamen mit Variable erstellen

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
mcdaniels
User
Beiträge: 168
Registriert: Mittwoch 18. August 2010, 19:53

Guten Morgen!
Nun, nach meinem gestrigen "Einbruch", weil ich mich nicht mehr rausgesehen habe, wollte ich etwas Anderes versuchen.

Ziel:
Frage nach der Anzahl der gewünschten Eingaben (Wieviele Zahlen möchten Sie erfassen?)
Der Benutzer soll dann abfragen können, welche Werte eingegeben worden sind (zB. Welcher Wert wurde für die Variable 3 angegeben)

Meine Lösung wäre gewesen, dass ich, basierend auf dem Wert der gewünschten Anzahl der Eingaben eine Anzahl von Variablen gleicher Anzahl erstelle und diesen Variablen dann Werte zuweise.

Nur müsste ich bei meinem Vorhaben aber einen Variablennamen aus einem Variablennamen erstellen.

Code: Alles auswählen

# -*- coding: utf8 -*-
eingabemenge = int(raw_input('Wieviele Zahlen möchten Sie erfassen? 0=Ende: '))
if eingabemenge == 0:
    exit

counter = 0
while counter < eingabemenge:
    counter = counter+1
    #Aus counter wollte ich dann die Variablennamen erzeugen, die per raw_input abgefragt werden:
    wert+counter =  raw_input('Wert ' + counter)
Eine weitere Idee wäre das schreiben in ein Array gwesen:

Code: Alles auswählen

# -*- coding: utf8 -*-
eingabemenge = int(raw_input('Wieviele Zahlen möchten Sie erfassen? 0=Ende: '))
if eingabemenge==0:
    exit

counter = 0

while counter < eingabemenge:
    counter = counter+1
    wert = input('Wert: ')
    zahlenfolge=array.append(wert)
Ist diese Vorgangsweise -abgesehen davon, dass sie nicht funktioniert - grundsätzlich gut oder eher zu verwerfen?

Danke!
LG
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

Wenn du mit 'Array' eine Liste meinst, wäre es der richtige Ansatz. Die Exception, die du bekommst, dürfte ein NameError sein, oder?
mcdaniels
User
Beiträge: 168
Registriert: Mittwoch 18. August 2010, 19:53

Hallo!
Sorry - die Fehlermeldung hätte ich auch gleich posten können:

Wieviele Zahlen möchten Sie erfassen? 0=Ende: 10
Wert: 1

Traceback (most recent call last):
File "C:\Python27\test", line 11, in <module>
zahlenfolge=array.append(wert)
NameError: name 'array' is not defined


LG
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

Und was könnte "name 'array' is not defined" bedeuten?
mcdaniels
User
Beiträge: 168
Registriert: Mittwoch 18. August 2010, 19:53

Python meint damit dass die Variable namens Array nicht definiert ist. Ich denke aber ich meinte doch ein Array und keine Liste:

Code: Alles auswählen

array = 'wert','wert2','wert3'
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

Was du da definierst, ist ein Tupel. Das hat zwar gewisse Ähnlichkeiten mit einem Array, ist aber z.B. unveränderlich. Generell ist es so, daß Leute, die im Bezug auf Python von Array sprechen (weil sie in anderen Sprachen mit solchen gearbeitet haben), eigentlich die eingebauten Listen meinen. Es gibt zwar auch Arrays (in irgendeinem Modul), diese werden aber nur ausgesprochen selten eingesetzt. Weil sie sich z.B. nicht einfach beliebig vergrößern lassen. Listen sind einfach praktischer.

Zu deinem Problem: Richtig. Du versuchst, etwas an ein Objekt zu anzuhängen, das noch gar nicht existiert. Vielleicht mußt du deine Datenstruktur irgendwo vorher mit einem Startwert versehen, damit du sie dann einsetzen kannst?
mcdaniels
User
Beiträge: 168
Registriert: Mittwoch 18. August 2010, 19:53

So!

Code: Alles auswählen

# -*- coding: latin1 -*-
eingabemenge = int(raw_input('Wieviele Zahlen möchten Sie erfassen? 0=Ende: '))
if eingabemenge==0:
    exit

counter = 0
platzhalter = []

while counter < eingabemenge:
    counter = counter+1
    wert = input('Wert: ')
    platzhalter.append(wert)

print platzhalter
funktioniert soweit mal :-)

Eine blöde Frage hätte ich zu obigem noch: Wie kann ich beim raw_input Befehl bewerkstelligen, dass nicht nur Wert: bei jeder Abfrage der Daten erscheint, sondern Wert 1:, Wert 2: ... Müsste also einen String mit einem Int verknüpfen, was ja nicht funktioniert...

Wobei ich hier die meiste Zeit nach einer guten Beschreibung betr. Python Listen gesucht und gefunden habe (http://diveintopython.org/native_data_types/lists.html)
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Code: Alles auswählen

>>> "Wert: " + str(42)
'Wert: 42'
>>> "Wert: %s" % 42
'Wert: 42'
Uebrigens solltest du input in Python 2.x nicht verwenden sondern lieber raw_input.
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
mcdaniels
User
Beiträge: 168
Registriert: Mittwoch 18. August 2010, 19:53

Hallo nochmals!
Ich hoffe, ich nerve nicht, vor allem da es simpelst ist (und für viele sicher lächerlich?) Fertig sieht es nun so aus und funktioniert:

Code: Alles auswählen

# -*- coding: latin1 -*-
eingabemenge = int(raw_input('Wieviele Zahlen möchten Sie erfassen? 0=Ende: '))
if eingabemenge==0:
    exit

counter = 0
platzhalter = []

print ('Sie wollen ' + str(eingabemenge) + ' Zahlen eingeben')


while counter < eingabemenge:
    counter = counter+1
    wert = input('Wert ' +str(counter)+':')
    platzhalter.append(wert)

print platzhalter
LG
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Mein nicht ganz ernst gemeinter Beitrag dazu:

Code: Alles auswählen

ask = 'Wieviele Zahlen? ', 'Nummer %d: '
print [int(raw_input(ask[1]%(i+1)) or 0) for i in range(int(raw_input(ask[0]) or 0))]
Bottle: Micro Web Framework + Development Blog
mcdaniels
User
Beiträge: 168
Registriert: Mittwoch 18. August 2010, 19:53

@Defnull:
Danke, jetzt weiss ich wieder, wo ich stehe :D Man beachte den fast unmerklichen Mehranteil von Zeilen (Zeichen) in meiner Variante *lol*
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

mcdaniels hat geschrieben:@Defnull:
Danke, jetzt weiss ich wieder, wo ich stehe :D Man beachte den fast unmerklichen Mehranteil von Zeilen (Zeichen) in meiner Variante *lol*
Eine kürzere Zeilenanzahl bedeutet nicht, dass das Programm besser ist. Auch Defnull würde seine Variante im praktischen Einsatz sicher nicht verwenden.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Trotzdem kann man es verbessern:

Code: Alles auswählen

import sys
anzahl = int(raw_input('Wieviele Zahlen möchten Sie erfassen? 0=Ende: '))
if anzahl == 0:
   sys.exit()

platzhalter = []
print 'Sie wollen %d Zahlen eingeben' % anzahl

for i in xrange(anzahl):
    wert = int(raw_input('Wert %d:' % i))
    platzhalter.append(wert)
Du solltest auch darauf achten, dass du die Unterschiede von Python 2 und 3 beachtest, z.b. hast du `print` einmal als Funktion und einmal als Statement benutzt und sowohl `raw_input` als auch `input` gleichzeitig, anstatt bei beiden die sichere Variante ueber `raw_input` zu nutzen.
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

/me hat geschrieben:
mcdaniels hat geschrieben:@Defnull:
Danke, jetzt weiss ich wieder, wo ich stehe :D Man beachte den fast unmerklichen Mehranteil von Zeilen (Zeichen) in meiner Variante *lol*
Eine kürzere Zeilenanzahl bedeutet nicht, dass das Programm besser ist. Auch Defnull würde seine Variante im praktischen Einsatz sicher nicht verwenden.
Richtig, meine Lösung ist alles andere als praktikabel :) Ich wollte nur mal angeben ;)

Du kannst ja trotzdem mal versuchen, den code zu verstehen. Soooo schwer ist es eigentlich gar nicht, wenn man List-Comprehensions erst einmal verstanden hat.
Bottle: Micro Web Framework + Development Blog
Antworten