Seite 1 von 1

Hash in Hash, aber wie?

Verfasst: Dienstag 2. Mai 2006, 15:15
von Bluecaspar
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;

Verfasst: Dienstag 2. Mai 2006, 16:50
von 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

Verfasst: Dienstag 2. Mai 2006, 17:43
von mitsuhiko
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

Verfasst: Mittwoch 3. Mai 2006, 07:25
von Bluecaspar
Sieht total abgefahren aus, aber es funktioniert. Genau so wie ichs haben wollte. Einfach genial. Vielen dank