Variablennamen zusammensetzen

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
Markus12
User
Beiträge: 195
Registriert: Dienstag 6. März 2007, 19:32
Wohnort: Frankfurt am Main

Hi,
ich hab da ein kleines Problem:
Ich möchte variablennamen zusammensetzen, ungefähr so hatte ich mir das vorgestellt:

Code: Alles auswählen

zufall=randint(1,9)
variable+str(zufall)='hallo'
Klappt leider nicht
Weiß jemand eine andere variante (möglichst einfach)? :D
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

meinst du zufällt so etwas?

Code: Alles auswählen

In [1]: from random import randint

In [2]: zufall = randint(1, 9)

In [3]: variable = 'hallo %d' % zufall

In [4]: print variable
hallo 5
Oder habe ich dich falsch verstanden?

MfG EnTeQuAk
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

Er hätte gerne eine Variable names:
variable(ergebnis von rand). Beispiel:
variable3
variable4 etc....

MfG apollo13
Markus12
User
Beiträge: 195
Registriert: Dienstag 6. März 2007, 19:32
Wohnort: Frankfurt am Main

Ne, :D
ich meinte es so:

1. Die Zufallszahl wird bestimmt.
2. Eine Variable, die von der Zufallszahl abhängt, wird definiert.

In etwa so:
Die zufallszahl ist jetzt mal 4, dann wird eine variable die "varible4" heißt auf "hallo" gesetzt.

Wenn beim nächsten Mal die zufallszahl 8 ist, dann heißt die variable "variable8" und ihr Wert ist "hallo"

Frag mich nicht für was ich das brauche *haha* :wink:
Markus12
User
Beiträge: 195
Registriert: Dienstag 6. März 2007, 19:32
Wohnort: Frankfurt am Main

Ja genau apollo13! :D
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

geht direkt nicht. (nicht, das ich wüsste ;) )

Aber du kanst Dictionarys benutzen:

Code: Alles auswählen

In [1]: from random import randint

In [2]: dictionary = {}

In [3]: zufall = randint(1, 9)

In [4]: dictionary['variable%d' %zufall] = 'hallo'

In [5]: dictionary
Out[5]: {'variable6': 'hallo'}
Das währe das gleiche, was du hättest ;)
oder anders:

Code: Alles auswählen

In [1]: from random import randint

In [2]: dictionary = {}

In [4]: dictionary['variable%d' % randint(1, 9)] = 'hallo'

In [5]: dictionary['variable%d' % randint(1, 9)] = 'hallo nummer 2'

In [6]: print dictionary
{'variable2': 'hallo nummer 2', 'variable6': 'hallo'}

In [7]: print dictionary['variable2']
hallo nummer 2
Je nachdem, was du machen möchtest...

Was möchtest du denn machen? ;)

MfG EnTeQuAk
BlackJack

Wobei man sich das mit den Zeichenketten sparen kann, der Namensteil vor der Zahl steht ja schon im Quelltext. Also:

Code: Alles auswählen

In [5]: variable = dict()

In [6]: variable[random.randint(0, 9)] = 'hallo'

In [7]: variable
Out[7]: {3: 'hallo'}

In [8]: variable[3]
Out[8]: 'hallo'
Markus12
User
Beiträge: 195
Registriert: Dienstag 6. März 2007, 19:32
Wohnort: Frankfurt am Main

Ja danke! :D
Ich mache gerade etwas einfaches: Tic Tac Toe
Ich brauchte das variablen zusammensetzen für die Berechnung, wo der gegner sich platziert.
Ich habe variablen definiert, die zeigen sollten, ob das Feld, in das er sich setzen will, schon besetzt ist.

Ich wollte das nicht so machen, da es zu unprofessionell ist:

Code: Alles auswählen

if zufall==1:
      variable1='belegt'
elif zufall==2:
      variable2='belegt'
...
so wollte ich das nicht machen :wink:
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Wenn du schon ein TicTacToe machst, bieten sich für dich vielleicht Tupel als Schlüssel des Dictionarys an, da du ja eh' ein n*m-Fed hast. Dann kannst du dir auch gleich das durchnummerieren der Felder sparen:

Code: Alles auswählen

def set(var, x, y, value):
    var[(x,y)] = value

def is_set(var, x, y, value):
    return (x,y) in var.keys() and var[(x,y)] == value

variable = {}
set(variable, 1, 1, "spam")
is_set(variable, 1, 1, "spam") # => True
is_set(variable, 2, 3, "eggs") # => False
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

ich würde mit True und False arbeiten und einem Dict wie oben beschreiben.

PS aber man kann 'Variable'-Variablen bauen ^^ aber etwas doof:

Code: Alles auswählen

>>> from random import randint
>>> string = "variable%d = 'hallo'"%randint(1,9)
>>> exec(string)
#
#  So jetzt müssen wir aber die Vairable suchen und deshalb ist ein dict besser:
#
>>> variable1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'variable1' is not defined
>>> variable2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'variable2' is not defined
>>> variable2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'variable2' is not defined
>>> variable3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'variable3' is not defined
>>> variable4
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'variable4' is not defined
>>> variable5
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'variable5' is not defined
>>> variable6
'hallo'
>>> 
Markus12
User
Beiträge: 195
Registriert: Dienstag 6. März 2007, 19:32
Wohnort: Frankfurt am Main

@Sr4l:

WAs bedeutet oder macht das "exec" genau?
Macht es das Variablenbauen möglich?
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

Das macht exec: http://docs.python.org/ref/exec.html

Erlaubt sozusagen "Variablenbau"
Markus12
User
Beiträge: 195
Registriert: Dienstag 6. März 2007, 19:32
Wohnort: Frankfurt am Main

Ok danke :D
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Wobei in dem Fall auch eval reicht... Das tolle an Eval und Exec ist ja, dass man sie in einem eigenen Namespace ausfuehren kann... zB so:

Code: Alles auswählen

from random import randint

myNamespace = dict()
eval("var%d=False" %randint(1,9)) in myNamespace
Aber wie schon erwaehnt... fuer deine Idee ist es nicht sinnvoll ;)
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Reingefallen: `in` gibts nur bei `exec`. Für `eval` sind die Namespaces ganz normale Argumente :)
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Wie hier alle schon gemeint haben sind dynamische Variablennamen eine schlechte Idee und man sollte lieber eine passende Datenstruktur nutzen - welche das ist hängt natürlich ganz vom Einsatzzweck ab.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

birkenfeld hat geschrieben:Reingefallen: `in` gibts nur bei `exec`. Für `eval` sind die Namespaces ganz normale Argumente :)
Och menno :-P
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Antworten