2017-12-22 13 views
2

ここには2つの辞書XYのコレクションである親辞書があります。 csvモジュールのDictReaderを使用してそれらを保存しました。1つの辞書オブジェクトに格納されている複数の順序付き辞書の項目を抽出します

2つの命令付き辞書を含むexample_dicto辞書を呼び出します。明確にするために、スパイダーで変数エクスプローラから、これは次のようになります。

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

[OK]をので、私はXYは、ここでの主キーを知っています。しかし、私はこれらの2つの辞書を通して価値観を見たいと思います。 XDuration (min)YDurationという列があり、行に応じてこれらの列を読み込んで値を返す機能が欲しいとします。

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

私はinfo_from_rowを呼び出すと、Pythonはトレースバックは、これらの「キー」のいずれも存在しないことを私に言っている通常のKeyError例外を返します。 したがって、基本的に辞書のコレクションである辞書を索引付けしてから、それらの「メイン」キーXとY内の索引キーを使用して値を戻す必要があります。 dict['key']メソッドでエラーが発生し、'Duration' in X以外にもFalseが返されるため、インデックスを作成するにはどうすればよいですか。

はより明確にするために、これらの辞書は、次のようになります。

print(example_dict) 

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

この関数をどのように呼びますか?あなたはそれにどのような議論をしていますか? –

+0

私はこの関数を呼び出す文法にも疑問を抱いています。単純な 'info_from_row(5、 'X')'は私にそのエラーを与えています。これは 'X'の' Duration'カラムの5番目の値の値を返します。 –

+0

'' example_dict ['X'] ['Duration'] ''は '' '54941'''を正しく返します。'' info_from_row(example_dict、 'X') ''を呼び出す場合、 '' row ['Duration'] ''は実際に '' exampld_dict ['Duration'] ''であり、実際には '' KeyError' '。 '' row [dict] ['Duration'] ''と '' row [dict] ['Duration(min)'] ''のようなものを使うべきです。 (また、変数 '' dict''を呼び出さないでください。これはPythonの組み込み関数です...)。 –

答えて

2

私はあなたがそれはあなたがやりたいとどのようにそれを達成するために何であるかについての非常に混乱していると信じています。私が正しくあなたの質問を理解すると仮定すると、これは私がそれを行うだろうかです:あなたが見ることができるように照会したい

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 

、期間は関係なく、どのサブディクショナリの印刷されます。 try使用していないまったく同じことを行うに


もう一つの方法 - exceptはこれです:まったく同じ結果を持っているとまったく同じ方法で呼び出され

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

info_from_row(example_dict['Y'])。その後、

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)']) 

しかし:


あなたが同様の機能引数であることをメインkey'X'または'Y'を)したい場合は、あなたが少しそうのような機能(それらのいずれか)を変更することができます呼び出しステートメントも同様に変更する必要があります。

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

確かに、これは初心者のパイソンの経験の中で辞書で辞書を見ているのは初めてですから、やや混乱します:P –

+0

@ Shiv_90それでは、あなたが何かを学びたいと思っていました!乾杯。 –

関連する問題