Seite 1 von 1

Listenname als String ausgeben

Verfasst: Montag 11. Februar 2008, 08:50
von mathi
Hi,
ich habe eine sicher sehr einfache Frage:

Code: Alles auswählen

HEB=('100','120','140','160','180','200','220','240','260','280','320','340','360','400','450','500','550','600','650','700','800','900','1000')
HEA=('100','120','140','160','180','200','220','240','260','280','320','340','360','400','450','500','550','600','650','700','800','900','1000')
HEM=('100','120','140','160','180','200','220','240','260','280','320','340','360','400','450','500','550','600','650','700','800','900','1000')
c=eval(raw_input('welche Liste?'))
print .....+c[5]
so soll es werden -> #print 'HEA'+HEA[5]
ausgegeben werden soll HEA200, d,.h. ich brauche den "Listennamen" als string (siehe auskommentierte Zeile). Nur wie gehrt das?

edit:

die Ausgabe HEA200 soll dann ebenfalls als Variable erkannt werden, sodass :

Code: Alles auswählen


HEA200=(190,200,6.5,10,18,134,0,11.7,53.83,42.25,3692.15,388.64,214.74,8.28,1335.5,133.55,101.9,4.98,20.98,108000,90,5.31,1291.94,162.11,10307.6,554.25)

print HEA200[0]
sodass dann der Wert 190 zurückgegeben wird.

Verfasst: Montag 11. Februar 2008, 08:57
von Hyperion
Bau Dir doch ein dictionary zusammen:

Code: Alles auswählen

HEB=('100','120','140','160','180','200','220','240','260','280','320','340','360','400','450','500','550','600','650','700','800','900','1000')
HEA=('100','120','140','160','180','200','220','240','260','280','320','340','360','400','450','500','550','600','650','700','800','900','1000')
HEM=('100','120','140','160','180','200','220','240','260','280','320','340','360','400','450','500','550','600','650','700','800','900','1000')
namen={"HEB":HEB, "HEA":HEA, "HEM":HEM}
c=eval(raw_input('welche Liste?'))
print namen.get(c)
Natürlich ungetestet ;)

Verfasst: Montag 11. Februar 2008, 09:16
von mathi
ok danke, aber vielleicht sollte ich anders fragen:

Code: Alles auswählen

c=eval(raw_input('welche Liste?'))
liste=.....+c[5]
so soll es "prinzipiell" werden -> #liste= eval('HEA'+str(HEA[5])) 
print liste # hier soll HEA200 zurückgegeben werden
ist sowas möglich, es sind sehr viele Listen die so kombiniert werden sollen :-(

Verfasst: Montag 11. Februar 2008, 09:51
von BlackJack
Ich habe zwar immer noch nicht verstanden was Du machen willst, aber bei "Variablennamen dynamisch zusammensetzen" sind Dictionaries in der Regel die richtige Antwort. Was auch immer Du machst: Vergiss, dass es ``eval`` gibt.

Wenn zum Beispiel alle "Variablen" in einem Dictionary vorliegen, könnte man das so lösen:

Code: Alles auswählen

listen = {
    'HEA': ('100', '120', '140', '160', '180', '200', '220', '240', '260'),
    'HEA200': (190, 200, 6.5, 10, 18, 134, 0)}
eingabe = 'HEA'
liste = listen['HEA%s' % listen[eingabe][5]]
print liste

Verfasst: Montag 11. Februar 2008, 10:00
von noise
Oder fals dich ``["mykey"]`` stört, baust du dir sowas:

Code: Alles auswählen

class AttrDict(dict):
    def __getattr__(self, key):
        return self[key]

    def __setattr__(self, key, value):
        self[key] = value

    def __delattr__(self, key):
        del self[key]
Damit kannst du dann mit ``HEA.HEA200[0]`` zugreifen, wobei ``HEA200`` der Key im ``dict`` ist und dessen wert eine Liste.

Es gilt ``HEA.HEA200[0]`` == ``HEA['HEA200'][0]``

HTH
noise

Verfasst: Montag 11. Februar 2008, 10:29
von mathi
ok, ich fange nochmal von vorne an:
als erstes sucht sich der Benutzer über Eingabe ein Stahlprofil aus:

Code: Alles auswählen

profillist=('IPE','IPEa','IPEo','IPEr','HEA','HEAA','HEB','HEM','HD','HL','HP','QHPk','QHPw','RHPk','RHPw')
z.B. eingabe = HEA
danach sucht sich der Benutzer aus den vielen HEA-Profilen sein spezielles heraus:

Code: Alles auswählen

HEA=('100','120','140','160','180','200','220','240','260','280','300','320','340','360','400','450','500','550','600','650','700','800','900','1000')
z.B. eingabe2 = 200

d.h. der Benutzer will mit dem Stahlprofil des Namens HEA200 rechnen.
dieses Profil hat viele Kennwerte

Code: Alles auswählen

HEA200=(190,200,6.5,10,18,134,0,11.7,53.83,42.25,3692.15,388.64,214.74,8.28,1335.5,133.55,101.9,4.98,20.98,108000,90,5.31,1291.94,162.11,10307.6,554.25,4891.62,303.59,4988.3,43200,0,0,0,0,0,0)
auf die der Benutzer zugreifen muß, z.B. HEA200[2] = 6.5

aufgrund der Menge ist es unmöglich, mit 1= HEA 2 = HEB usw. zu arbeiten, die Auswahl muß über die Eingaben (eingabe=HEA + eingabe2= 200) = HEA200 erfolgen.
Ich hoffe jetzt wird es klarer. :?

Verfasst: Montag 11. Februar 2008, 10:34
von Jan-Peer
Und wo ist da jetzt noch das Problem? Die o.g. Lösungen sind doch geeignet :roll:

Edit: Abgesehen davon würde ich an deiner Stelle lieber Objekte als Listen verwenden. Das Auslesen von Kennzahlen über Indizes macht bei diesen Größenordnungen nicht wirklich Spaß - da brauchst du ja ein Tafelwerk, um den richtigen Index zu finden. Lesbar und Anwenderfreundlich ist was anderes ...

Verfasst: Montag 11. Februar 2008, 11:01
von Leonidas
Ich hätte das mit Instanzen einer Metall-Klasse gemacht, die jeweils einen Namen ("HEA") und ein Profil ("200") hat. Dann würde ich den Nutzer einfach nach Name und Profil fragen. Ist wahrscheinlich angenehmer, als dynamisch Variablennamen zu erstellen, den User Indizes abzufragen etc.

Verfasst: Montag 11. Februar 2008, 11:05
von BlackJack
Oft ist es besser das zu lösende Problem zu beschreiben, statt der Probleme mit einer Lösung die man dafür schon hat oder umsetzen will. In diesem Fall ist die einfachste Datenstruktur nämlich ein verschachteltes Dictionary:

Code: Alles auswählen

profile = {
    'HEA': {
        '200': (190, 200, 6.5, 10, 18, 134, 0)}}
eingabe_a = 'HEA'
eingabe_b = '200'
profil = profile[eingabe_a][eingabe_b]
print profil[2]

Verfasst: Montag 11. Februar 2008, 11:33
von mathi
@BlackJack

im prinzip wäre Deine Lösung super, danke dafür. Nur ist das eine gewaltige Datenmenge, die ich umarbeiten müßte. Und jedes dieser Kombinationen enthält soviele Daten wie im o.g. HEA200 !!!!!!!!!!! :shock:
:oops: Gibts da nich was anderes? (Mir fällt wirklich nichts ein).

Code: Alles auswählen

profillist=('IPE','IPEa','IPEo','IPEr','HEA','HEAA','HEB','HEM','HD','HL','HP','QHPk','QHPw','RHPk','RHPw')
HD=('260x54.1','260x68.2','260x93','260x114','260x142','260x172','260x225','260x299','320x74.2','320x97.6','320x127','320x158','320x198','320x245','320x300','320x368','320x451','360x134','360x147','360x162','360x179','360x196','400x187','400x216','400x237','400x262','400x287','400x314','400x347','400x382','400x421','400x463','400x509','400x551','400x592','400x634','400x677','400x744','400x818','400x900','400x990','400x1086')
HEA=('100','120','140','160','180','200','220','240','260','280','300','320','340','360','400','450','500','550','600','650','700','800','900','1000')
HEAA=('100', '120', '140', '160', '180', '200', '220', '240', '260', '280', '300', '320', '340', '360', '400', '450', '500', '550', '600', '650', '700', '800', '900', '1000')
HEB=('100', '120', '140', '160', '180', '200', '220', '240', '260', '280', '300', '320', '340', '360', '400', '450', '500', '550', '600', '650', '700', '800', '900', '1000')
HEM=('100', '120', '140', '160', '180', '200', '220', '240', '260', '280', '300', '320', '340', '360', '400', '450', '500', '550', '600', '650', '700', '800', '900', '1000')
HL=('1000AA','1000A','1000B','1000M','1000x477','1000x554','1000x642','1000x748','1100A','1100B','1100M','1100R')
HP=('220x57.2', '260x75', '260x87.3', '305x88', '305x95', '305x110', '305x126', '305x149', '305x180', '305x186', '305x223', '320x88.5', '320x103', '320x117', '320x147', '320x184', '360x84.3', '360x109', '360x133', '360x152', '360x174', '360x180', '400x122', '400x140', '400x158', '400x176', '400x194', '400x213', '400x231')
IPE=('80', '100', '120', '140', '160', '180', '200', '220', '240', '270', '300', '330', '360', '400', '450', '500', '550', '600')
IPEa=('80', '100', '120', '140', '160', '180', '200', '220', '240', '270', '300', '330', '360', '400', '450', '500', '550', '600')
IPEaa=('140','160','180')
IPEo=('180', '200', '220', '240', '270', '300', '330', '360', '400', '450', '500', '550', '600')
IPEr=('140', '160', '180', '200', '220', '240', '270', '300', '330', '360', '400', '450', '500', '550', '600')
IPEv=('450','500','550','600')
QHPk=('30x2', '40x2', '40x3', '50x2', '50x3', '50x5', '60x2', '60x3', '60x5', '70x3', '70x4', '70x5', '80x3', '80x4', '80x5', '80x6.3', '90x3', '90x4', '90x5', '90x6.3', '100x4', '100x5', '100x6.3', '120x4', '120x5', '120x6.3', '120x8', '140x4', '140x5', '140x6.3', '140x8', '140x10', '150x5', '150x6.3', '150x8', '150x10', '160x4', '160x5', '160x6.3', '160x8', '160x10', '180x6.3', '180x8', '180x10', '180x12.5', '200x6.3', '200x8', '200x10', '200x12.5', '250x6.3', '250x8', '250x10', '250x12.5', '300x8', '300x10', '300x12.5', '350x8', '350x10', '350x12.5')
QHPw=('40x2.9', '40x4', '50x2.9', '50x4', '60x2.9', '60x4', '60x5', '70x3.2', '70x4', '70x5', '80x3.6', '80x4.5', '80x5.6', '90x3.6', '90x4.5', '90x5.6', '100x4', '100x5', '100x6.3', '120x4.5', '120x5.6', '120x6.3', '140x5.6', '140x7.1', '140x8.8', '150x6.3', '150x8', '150x10', '160x6.3', '160x8', '160x10', '180x6.3', '180x8', '180x10', '200x6.3', '200x8', '200x10', '220x6.3', '220x8', '220x10', '250x7.1', '250x8.8', '250x11', '260x7.1', '260x8.8', '260x11')
RHPk=('40x20x2', '40x20x2.5', '50x30x2', '50x30x3', '50x30x4', '60x40x2', '60x40x3', '60x40x4', '60x40x5', '80x40x2', '80x40x3', '80x40x4', '80x40x5', '90x50x3', '90x50x4', '90x50x5', '100x60x3', '100x60x4', '100x60x5', '100x60x6.3', '120x60x3', '120x60x4', '120x60x5', '120x60x6.3', '120x80x4', '120x80x5', '120x80x6.3', '140x80x4', '140x80x5', '140x80x6.3', '150x100x4', '150x100x5', '150x100x6.3', '150x100x8', '160x80x4', '160x80x5', '160x80x6.3', '160x80x7', '180x100x5', '180x100x6.3', '180x100x8', '180x100x10', '200x100x5', '200x100x6.3', '200x100x8', '200x100x10', '200x120x5', '200x120x6.3', '200x120x8', '200x120x10', '250x150x6.3', '250x150x8', '250x150x10', '250x150x12.5', '300x200x5', '300x200x6', '300x200x8', '300x200x10', '300x200x12.5', '400x200x10', '400x200x12.5')
RHPw=('50x30x2.9', '50x30x4', '60x40x2.9', '60x40x4', '70x40x2.9', '70x40x4', '80x40x2.9', '80x40x4', '80x40x5', '90x50x3.2', '90x50x4', '90x50x5', '100x50x3.6', '100x50x4.5', '100x50x5.6', '100x60x3.6', '100x60x4.5', '100x60x5.6', '120x60x4', '120x60x5', '120x60x6.3', '140x80x4', '140x80x5', '140x80x6.3', '160x90x4.5', '160x90x5.6', '160x90x7.1', '180x100x5.6', '180x100x7.1', '180x100x8.8', '200x120x6.3', '200x120x8', '200x120x10', '220x120x6.3', '220x120x8', '220x120x10', '260x140x6.3', '260x140x8', '260x140x10', '260x180x6.3', '260x180x8', '260x180x10', '300x200x8', '300x200x8.8', '300x200x10', '300x200x12.5')



Verfasst: Montag 11. Februar 2008, 11:51
von BlackJack
Dann schreib halt ein Programm, was die Daten umarbeitet. Die wären letztendlich wahrscheinlich auch besser in externen Dateien oder einer Datenbank aufgehoben als in Python-Quelltext.

Verfasst: Montag 11. Februar 2008, 12:58
von mathi
@BlackJack

vielen Dank für die Antwort.
Letzte Frage dazu: Warum ist ``eval()`` eine schlechte Lösung?

Verfasst: Montag 11. Februar 2008, 13:08
von keppla
mathi hat geschrieben:@BlackJack

vielen Dank für die Antwort.
Letzte Frage dazu: Warum ist ``eval()`` eine schlechte Lösung?
Eval ist dazu da, code auszuführen, den du zur zeit des Schreibens noch nicht kennst.
Das ist in 99,9999% der Fälle nicht der Fall, man kennt die Funktionalität, ist aber nicht fit genug mit Dingen wie dicts, first-class-funktionen und anderen "indirektionsmaßnahmen", um die funktionalität umzusetzen.
Eval hat gegenüber dem statischen Code mehrere Nachteile:

1. Es ermöglicht Sicherheitslücken. Irgendwie muss der code ja zusammengebastelt werden (sonst bräuchte man kein eval), und so können Userdaten hineinrutschen, die dann zu Programmanweisungen werden.
2. Es ist langsamer, da es jedes mal neu compiled werden muss.
3. Es zerbricht deine Toolchain. Code in Evals wird nicht gesyntax-hilited, refactoringtools erkennen es nicht, etc.

Verfasst: Montag 11. Februar 2008, 13:13
von Rebecca
Der Benutzer kann dann Python-Code eingeben, der ausgefuehrt wird:

Code: Alles auswählen

>>> import os
>>> a = eval(raw_input("Gib was ein: "))
Gib was ein: os.remove("wichtige_datei")
Upps... Und a ist danach auch keine Zahl, dann bekommst du im Programmverlauf evtl. deswegen irgendwo eine Fehlermeldung...

Ausserdem bekommt du unverstaendliche Fehlermeldungen, wenn der Benutzer was unerwartetes eingibt:

Code: Alles auswählen

>>> a = eval(raw_input("Gib eine Zahl ein: "))
Gib eine Zahl ein: hallo
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "<string>", line 0, in ?
NameError: name 'hallo' is not defined
Da ist sowas doch schon besser:

Code: Alles auswählen

>>> a = int(raw_input("Gib eine Zahl ein: "))
Gib eine Zahl ein: sdf
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
ValueError: invalid literal for int(): sdf
Da kannst du dir sicher sein, dass wenn keine Ausnahme auftrat, a hinterher auch wirklich ein Integer ist.