2017-12-22 1 views
2

Ich habe hier ein Elternwörterbuch, das eine Sammlung von zwei Wörterbüchern X und Y ist. Gespeichert mit dem DictReader des csv-Moduls.Elemente aus mehreren geordneten Wörterbüchern extrahieren, die in einem dict-Objekt gespeichert sind

Rufen wir dieses Wörterbuch example_dicto, das zwei geordnete Wörterbücher enthält. Zur Klarstellung von dem variablen Explorer in Spyder dies wie folgt aussieht:

Name   Type Size Value 
example_dict dict 2  {'X':OrderedDict, 'Y': OrderedDict} 

Ok, damit ich weiß, X und Y sind die wichtigsten Schlüssel hier. Aber ich möchte Werte durch diese zwei Wörterbücher nachschlagen. Angenommen, es gibt eine Spalte für X und Duration (min) für Y und ich möchte meine Funktion lesen diese Spalten abhängig von einer Zeile und geben Sie ihre Werte zurück.

def info_from_row(row, dictionary): 
    if dict == 'X': 
     duration = float(row['Duration']) 
    else: 
     duration = float(row['Duration (min)']) 
    return duration 

Als ich info_from_row nennen, Python gibt die üblichen KeyError, wo die Zurückverfolgungs sagt mir, dass keines dieser ‚Schlüssel‘ existieren. Also im Grunde muss ich ein Wörterbuch, das eine Sammlung von Wörterbüchern ist Index und dann Index-Schlüssel innerhalb ihrer "Haupt" Schlüssel X und Y, um einen Wert zurückzugeben. Wie indexiere ich sie, da die übliche Methode dict['key'] mir einen Fehler gibt und 'Duration' in XFalse zurückgibt.

Weitere Klärung sehen diese Wörterbücher wie folgt aus:

print(example_dict) 

{'X': OrderedDict([('ID', '123456'), ('Duration', '54941')]), 
'Y': OrderedDict([('ID', '789101'), ('Duration (min)', '7869')])} 
+0

Wie rufen Sie diese Funktion auf? Welche Argumente gehen Sie an? –

+0

Ich bekomme Zweifel an der Grammatik, diese Funktion auch aufzurufen. Der einfache 'info_from_row (5, 'X')' gibt mir diesen Fehler. Das ist der Wert für den fünften Wert der 'Duration'-Spalte von' X'. –

+0

'' example_dict ['X'] ['Dauer'] '' gibt '' '54941''' zurück.Wenn Sie '' info_from_row (example_dict, 'X') '' aufrufen, dann ist '' row ['Duration'] '' '' exampld_dict ['Duration'] '', was in der Tat ein '' KeyError' ist '. Sie sollten etwas wie "row [dict] ['Duration'] '' und '' row [dict] [' Duration (min) '] '' verwenden. (Rufen Sie auch nicht die Variablen '' dict'' auf, es ist ein eingebauter Python ...). –

Antwort

2

Ich glaube, Sie ziemlich verwirrt sind, was es ist was Sie tun wollen und wie es zu erreichen. Unter der Annahme, ich Ihre Frage richtig verstanden habe, ist dies, wie ich es tun würde:

from collections import OrderedDict 

def info_from_row(my_dict): 
    try: 
     return float(my_dict['Duration']) 
    except KeyError: 
     return float(my_dict['Duration (min)']) 

example_dict = {'X': OrderedDict([('ID', '123456'), ('Duration', '54941')]), 
       'Y': OrderedDict([('ID', '789101'), ('Duration (min)', '7869')])} 

print(info_from_row(example_dict['X'])) # -> 54941.0 
print(info_from_row(example_dict['Y'])) # -> 7869.0 

Wie Sie sehen können, ist die Dauer gedruckt, unabhängig davon, welche subdictionary Sie abfragen möchten. -


Eine andere Möglichkeit, die genau die gleiche Sache zu tun, die nicht try nicht verwendet except dies:

def info_from_row(my_dict): 
    if 'Duration' in my_dict: 
     return float(my_dict['Duration']) 
    else: 
     return float(my_dict['Duration (min)']) 

, die genau das gleiche Ergebnis hat und in genau der gleichen Art und Weise genannt; info_from_row(example_dict['Y']).


Wenn Sie die Haupt key ('X' oder 'Y') wollen auch eine Funktion-Argument sein, können Sie leicht die Funktion (einer von ihnen) modifizieren, wie so:

def info_from_row(my_dict, main_key): 
    if 'Duration' in my_dict[main_key]: 
     return float(my_dict[main_key]['Duration']) 
    else: 
     return float(my_dict[main_key]['Duration (min)']) 

aber dann Die Aufrufanweisungen müssen ebenfalls geändert werden:

print(info_from_row(example_dict, 'X')) # -> 54941.0 
print(info_from_row(example_dict, 'Y')) # -> 7869.0 
+0

Ja, sicherlich bin ich etwas verwirrt, da dies das erste Mal in meiner Anfänger-Python-Erfahrung ist, dass ich Wörterbücher mit Wörterbüchern sehe: P –

+0

@ Shiv_90 Nun, dann hoffte ich, dass du etwas gelernt hast! Prost. –

Verwandte Themen