Seite 1 von 1

Variablennamen zusammensetzen

Verfasst: Sonntag 25. März 2007, 13:37
von Markus12
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

Verfasst: Sonntag 25. März 2007, 13:44
von EnTeQuAk
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

Verfasst: Sonntag 25. März 2007, 13:45
von apollo13
Er hätte gerne eine Variable names:
variable(ergebnis von rand). Beispiel:
variable3
variable4 etc....

MfG apollo13

Verfasst: Sonntag 25. März 2007, 13:49
von Markus12
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:

Verfasst: Sonntag 25. März 2007, 13:50
von Markus12
Ja genau apollo13! :D

Verfasst: Sonntag 25. März 2007, 14:05
von EnTeQuAk
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

Verfasst: Sonntag 25. März 2007, 14:16
von 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'

Verfasst: Sonntag 25. März 2007, 14:28
von Markus12
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:

Verfasst: Sonntag 25. März 2007, 14:42
von EyDu
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

Verfasst: Sonntag 25. März 2007, 15:18
von Sr4l
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'
>>> 

Verfasst: Sonntag 25. März 2007, 19:28
von Markus12
@Sr4l:

WAs bedeutet oder macht das "exec" genau?
Macht es das Variablenbauen möglich?

Verfasst: Sonntag 25. März 2007, 19:35
von apollo13
Das macht exec: http://docs.python.org/ref/exec.html

Erlaubt sozusagen "Variablenbau"

Verfasst: Sonntag 25. März 2007, 19:41
von Markus12
Ok danke :D

Verfasst: Sonntag 25. März 2007, 23:47
von nkoehring
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 ;)

Verfasst: Montag 26. März 2007, 19:19
von birkenfeld
Reingefallen: `in` gibts nur bei `exec`. Für `eval` sind die Namespaces ganz normale Argumente :)

Verfasst: Montag 26. März 2007, 19:40
von Leonidas
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.

Verfasst: Montag 26. März 2007, 19:49
von nkoehring
birkenfeld hat geschrieben:Reingefallen: `in` gibts nur bei `exec`. Für `eval` sind die Namespaces ganz normale Argumente :)
Och menno :-P