Listenname als String ausgeben

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
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

Montag 11. Februar 2008, 08:50

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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Montag 11. Februar 2008, 08:57

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 ;)
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

Montag 11. Februar 2008, 09:16

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 :-(
BlackJack

Montag 11. Februar 2008, 09:51

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
noise
User
Beiträge: 62
Registriert: Donnerstag 7. Februar 2008, 00:15

Montag 11. Februar 2008, 10:00

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
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

Montag 11. Februar 2008, 10:29

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. :?
Jan-Peer
User
Beiträge: 166
Registriert: Dienstag 2. Oktober 2007, 10:55

Montag 11. Februar 2008, 10:34

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 ...
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 11. Februar 2008, 11:01

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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
BlackJack

Montag 11. Februar 2008, 11:05

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]
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

Montag 11. Februar 2008, 11:33

@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')


BlackJack

Montag 11. Februar 2008, 11:51

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.
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

Montag 11. Februar 2008, 12:58

@BlackJack

vielen Dank für die Antwort.
Letzte Frage dazu: Warum ist ``eval()`` eine schlechte Lösung?
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

Montag 11. Februar 2008, 13:08

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.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Montag 11. Februar 2008, 13:13

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.
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Antworten