Werte aus Dictionary auslesen

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
recnice
User
Beiträge: 45
Registriert: Sonntag 20. März 2011, 12:10

Dienstag 6. März 2012, 09:03

Hallo,

ich habe folgendes Problem:

in einem File möchte ich folgende Einträge generieren:

readFSI 1 pandas_press_bc_5_step_1_cycle_12.dat
readFSI 2 pandas_press_bc_7_step_1_cycle_12.dat
readFSI 3 pandas_press_bc_9_step_1_cycle_12.dat

Die Information welches readFSI zu welchem bc gehört is in dem dict surf_number = {'FSI_surf1':'5','FSI_surf2':'7','FSI_surf3':'9'}
gespeichert.

Mein Problem ist, wie kann ich eine Schleife über die Einträge machen, also 3 mal readFSI und dass er für z.B. den ersten Eintrag die 5 aus
dem dict surf_number ausliest.

Mein bisheriges Programm sieht so aus:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#06.03.2012
from string import Template

bc    = 500
time  = 1000
cycle = 90

#-----------------------------------------------------------------------
TEMPLATE_II = '''
readFSI ${fsi_bound} pandas_press_bc_${bc_no}_step_${end_time}_cycle_${cycle_no}
'''
#String ----->  Template
Temp_readFSI = Template(TEMPLATE_II)
#-----------------------------------------------------------------------

surf_number = {'FSI_surf1':'5','FSI_surf2':'7','FSI_surf3':'9'}
print surf_number

for x in range(len(surf_number)):
   replace={'fsi_bound':x+1,'bc_no': surf_number.get('FSI_surf'+x),'end_time':time,'cycle_no':cycle}
   print(Temp_readFSI.substitute(replace))
Hat jemand eine Idee, ich steh komplett auf dem schlauch :K
BlackJack

Dienstag 6. März 2012, 09:08

@recnice: Überleg doch mal was die Ausnahme bedeutet, die Du da bekommst.
mutetella
User
Beiträge: 1690
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Dienstag 6. März 2012, 09:11

Guten morgen,

lies mal die Dokumentation zu dict. Dort findest Du unter anderem 'items()', welches Dir zu Deinem dict eine Liste mit (key, value) Paaren liefert:

Code: Alles auswählen

for key, item in surf_number.items():
    print key, item
     
FSI_surf2 7
FSI_surf3 9
FSI_surf1 5
mutetella
Zuletzt geändert von mutetella am Dienstag 6. März 2012, 09:12, insgesamt 1-mal geändert.
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Dienstag 6. März 2012, 09:11

Du musst das ganze Problem präziser darstellen!

Du postest Code, zeigst / sagst aber nicht, was daran nicht klappt oder was dabei herauskommt und was Du stattdessen erwartet hättest.
recnice hat geschrieben: Mein Problem ist, wie kann ich eine Schleife über die Einträge machen, also 3 mal readFSI und dass er für z.B. den ersten Eintrag die 5 aus
dem dict surf_number ausliest.
Stelle doch mal bitte den Zusammenhang zwischen den Datenstrukturen besser dar! Was willst Du erreichen? Aufgrund welcher Daten willst Du im Dictionary auf etwas zugreifen?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3))
assert encoding_kapiert
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Dienstag 6. März 2012, 10:10

@mutetella:
Daran hab ich zuerst auch gedacht, wenn man aber die richtig sortierte Reihenfolge will, muss man mehr tun:

Code: Alles auswählen

In [16]: import re

In [17]: d = {'FSI_surf1' : '5', 'FSI_surf11': '6', 'FSI_surf2': '7'}

In [18]: for k in sorted(d, key=lambda k: map(int, re.findall(r'\d+', k))):
    print k, d[k]
   ....:     
FSI_surf1 5
FSI_surf2 7
FSI_surf11 6
Und das am besten noch mit Fehlerbehandlung. Der Ursprungscode ist allerdings tatsaechlich grausam.
recnice
User
Beiträge: 45
Registriert: Sonntag 20. März 2011, 12:10

Dienstag 6. März 2012, 10:25

Na ja, so grausam ist er nicht. Jetzt funktioniert's :lol: :

Code: Alles auswählen

for x in range(len(surf_number)):
		print surf_number.get('FSI_surf'+str(x+1))
		replace={'fsi_bound':x+1,'bc_no': surf_number.get('FSI_surf'+str(x+1)),'end_time':t_end,'cycle_no':CYCLE}
		cmd.write(Temp_readFSI.substitute(replace))
Ausgabe:
  • readFSI 1 pandas_press_bc_5_step_0.05_cycle_1

    readFSI 2 pandas_press_bc_7_step_0.05_cycle_1

    readFSI 3 pandas_press_bc_9_step_0.05_cycle_1
mutetella
User
Beiträge: 1690
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Dienstag 6. März 2012, 10:27

@cofi:
Stimmt, im Beispiel von recnice sieht es danach aus, als wolle er/sie ein sortiertes Ergebnis.

In dem Fall würde ich mir aber dann überlegen, ob die Konstante 'FSI_surf' denn überhaupt im key stehen muss oder hier ein

Code: Alles auswählen

In [20]: FSI_surf = ((3, 9), (2, 7), (1, 5))

In [21]: sorted(FSI_surf)
Out[21]: [(1, 5), (2, 7), (3, 9)]
generell mehr Sinn machen würde.

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Antworten