Hash in Hash, aber wie?

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
Bluecaspar
User
Beiträge: 27
Registriert: Samstag 18. März 2006, 20:06

Ich mache mir gerade Gedanken darüber wie ich über einen Hash auf einen Wert über quasi drei unterschielichen keys eindeutig zugreifen kann.

Meine erste Idee war einen Hash mit einem Hash zu verketten, leider war der zweite Hash nicht eindeutig und wurde ständig überspielt.

Code: Alles auswählen

#      hash1                       
# |------------|              
#   key   key   value  vlaue  
# | Gen | Atom |  MM  |  PM  |
#              |-------------|
#                   hash2
Die Bezeichnungen mal dahin gestellt. Das Probolem ist das ich die Daten nach und nach aus einer Datei einlese in der in jeder Zeile Gen, Atom und MM oder PM und ein spezieller Wert der mit allen drei vorherigen Einträgen in Verbindung steht. In einer anderen Zeile steht dann für PM oder für MM, je nach dem was vorher schon einmal aufgetaucht war, die selben Einträge für Gen und Atom und ein weiterer Wert. Jedem MM und PM soll also ein Wert zugewiesen, der in Verbindung mit einem Gen und einem Atom steht.

Mein Versuch der leider nicht eindeutig war sah folgendermaßen aus.

sl[2] = MM or PM
sl[3] = Atom
sl[4] = Value
sl[5] = Gen



Code: Alles auswählen

#!/usr/bin/python
file = open('../../1/development/abm1.out','r')

genHash = {}
atomHash = {}

for line in file:

    sl = line.split() # [S]plited[L]ine

    if not atomHash.has_key(sl[3]): # wenn key nicht vorhanden, dann initialisiere den atomHash
        atomHash[sl[3]] = {'MM':'none','PM':'none'}

    if 'MM' in sp[2]:  # weise dem MM einen Wert zu 
        atomHash[sl[3]]['MM'] = sl[4]

    else:
        atomHash[sl[3]]['PM'] = sl[4] # weise dem PM einen Wert zu 

	genHash[sl[5]] = {'median':'none','atom':atomHash[sl[3]]}

Kann man vielleicht einen Hash anlegen dem man drei Keys zuweisen kann um einen Wert zu speichern?



Etwas vergleichbares hab ich auch in Perl gesehen, allerdings hab ichs nicht geschafft in Python um zu bauen, wäre aber genial wenn ich so hinbekommen könnte da das selbe so in einer Zeile erledigt wurde:

$pmMMArray{$GEN}{$PMorMM}{$ATOM}=$Value;
BlackJack

Also ich gehe mal nur von der Perl-Zeile aus, das sollte (ungetestet) so gehen:

Code: Alles auswählen

mm_map = dict()
for line in lines:
    dummy, dummy, mm_pm, atom, value, gen = line.split()
    tmp = mm_map.setdefault(gen, dict())
    tmp = tmp.setdefault(mm_pm, dict())
    tmp[atom] = value
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

BlackJack hat geschrieben:Also ich gehe mal nur von der Perl-Zeile aus, das sollte (ungetestet) so gehen:

Code: Alles auswählen

mm_map = dict()
for line in lines:
    dummy, dummy, mm_pm, atom, value, gen = line.split()
    tmp = mm_map.setdefault(gen, dict())
    tmp = tmp.setdefault(mm_pm, dict())
    tmp[atom] = value
und ich verkürze das mal in:

Code: Alles auswählen

mm_map = {}
for line in lines:
    _, _, mm_pm, atom, value, gen = line.split()
    mm_map.setdefault(gen, {}).setdefault(mm_pm, {})[atom] = value
TUFKAB – the user formerly known as blackbird
Bluecaspar
User
Beiträge: 27
Registriert: Samstag 18. März 2006, 20:06

Sieht total abgefahren aus, aber es funktioniert. Genau so wie ichs haben wollte. Einfach genial. Vielen dank
Antworten