2017-06-17 3 views
1

Ich habe einen defaultdict(dict) Wert wie:Wie man einen neuen Schlüssel vom vorhandenen Schlüssel einstellt: Wertpaar eines defaultdict?

defaultdict(<class 'dict'>, { 
    'AL2G22360.t1_Sp': { 
    'locus': 'AL2G22360.t1', 
    'length': '663', 
    'strain': 'Sp'}, 
    'AL2G22360.t1_My': { 
    'locus': 'AL2G22360.t1', 
    'length': '389', 
    'strain': 'My'}, 
    'AL2G22220.t1_My': { 
    'locus': 'AL2G22220.t1', 
    'length': '865', 
    'strain': 'My'}, 
    'AL2G22220.t1_My': { 
    'locus': 'AL2G22220.t1', 
    'length': '553', 
    'strain': 'My' ........}}) 

Sag mal, ich will es in einer Art und Weise zu ändern, dass die major keyvalue of variable **locus** ist. Da gibt es ein Duplikat für locus value (nicht eindeutig, aber einige können eindeutig sein), möchte ich eine andere Unterschlüssel My vs. Sp von variable **strain** haben. Der Rest der Daten kann so sein wie er ist.

Erwarteter Ausgang:

defaultdict(<class 'dict'>, { 
    'AL2G22360.t1': { 
    'Sp': { 
     'keys': 'AL2G22360.t1_Sp', 
     'length': '663'}, 
    'My': { 
     'keys': 'AL2G22360.t1_My', 
     'length': '389'}}, 
    'AL2G22220.t1': { 
    'My': { 
     'keys': 'AL2G22220.t1_My', 
     'length': '865'}, 
    'Sp': { 
     'keys': 'AL2G22220.t1_Sp', 
     'length': '553'}, .....}}) 
+0

Die 'erwartete Ausgabe' war syntaktisch falsch. Ich habe geahnt, was du meintest, und deine Frage entsprechend bearbeitet. Bitte vergewissere dich, dass ich dich nicht falsch verstanden habe. – Alfe

+0

@Alfe: Du hast es schön gemacht. Vielen Dank. Mein Kopf tut mir weh, wie ich dieses Problem angehen kann. Hast du irgendwelche Tipps dazu? – everestial007

+0

Ich habe gerade die 'variablen Schlüssel' ein wenig aktualisiert, um sicherzustellen, dass die Frage sauber war. Aber die Absicht der Frage bleibt die gleiche. – everestial007

Antwort

1

ich es so tun würde:

result = defaultdict(lambda: defaultdict(dict)) 
for k, v in a.items(): 
    result[v['locus']][v['strain']] = { 'keys': k, 'length': v['length'] } 
return result 

Dies schafft eine defaultdict, deren Werte wieder sind defaultdicts, deren Werte dicts. (Dies stimmt mit der angegebenen Ausgabe überein.) Dann wird dies auf direkte Weise ausgefüllt, indem das Original durchlaufen und alle Werte in das neue Format kopiert werden.

+0

Können Sie mir eine Erklärung geben, damit ich den Prozess verstehen kann? Es ist einfach gut zu lernen. Vielen Dank ! – everestial007

+0

Tut mir leid, es funktioniert jetzt, übrigens. – everestial007

+0

Ich habe eine kurze Beschreibung hinzugefügt. Sie können mehr Einsicht gewinnen, indem Sie "result", "k" und "v" in jeder Iteration ausdrucken. Sie können 'pprint' verwenden, um eine formatierte Ausgabe zu erhalten. – Alfe

Verwandte Themen