1

複数のレベルで複数の値を保持するマトリックスを構築しようとしています。私は次のように構築された辞書を生成しようとしています:

{'routername':{'channel':{'01':<value>,'02':<value>}}}

最高レベルのキーの数は異なる場合があります。

スクリプトは、使用可能なルーターのリストと使用可能なチャネルの別のリストを生成しています。キーをテストするかなり面倒な関数を作成しました。キーがまだ存在しない場合は、キーを辞書に追加します。

それで、リスト「ルーター」のキーの値が空の辞書を作成する簡単な方法がないかどうか疑問に思っていました

def AddToChart(passed_seq):
    try:
        if str(passed_seq[0]) in chart_dict:
            if str(passed_seq[1]) in chart_dict[passed_seq[0]]:
                if str(passed_seq[2]) in chart_dict[passed_seq[0]][passed_seq[1]]:
                    if str(passed_seq[3]) in chart_dict[passed_seq[0]][passed_seq[1]][passed_seq[2]]:
                        chart_dict[passed_seq[0]][passed_seq[1]][passed_seq[2]][passed_seq[3]].update(err_sub_dict)

                    else:    
                        chart_dict[passed_seq[0]][passed_seq[1]][passed_seq[2]].update({passed_seq[3]:{}})
                        chart_dict[passed_seq[0]][passed_seq[1]][passed_seq[2]][passed_seq[3]].update(err_sub_dict)
                else:
                    chart_dict[passed_seq[0]][passed_seq[1]].update({passed_seq[2]:{passed_seq[3]:{}}})
                    chart_dict[passed_seq[0]][passed_seq[1]][passed_seq[2]][passed_seq[3]].update(err_sub_dict)
            else:
                chart_dict[passed_seq[0]].update({passed_seq[1]:{passed_seq[2]:{passed_seq[3]:{}}}})
                chart_dict[passed_seq[0]][passed_seq[1]][passed_seq[2]][passed_seq[3]].update(err_sub_dict)
        else:     
            chart_dict.update({passed_seq[0]:{passed_seq[1]:{passed_seq[2]:{passed_seq[3]:{}}}}})
            chart_dict[passed_seq[0]][passed_seq[1]][passed_seq[2]][passed_seq[3]].update(err_sub_dict)
    except ValueError:
        print "AddToChart: ",err_sub_dict,sys.exc_info()[1][0]   
    except:
        print sys.exc_info()
        print "AddToChart: variable not defined: "    + str(passed_seq)
4

2 に答える 2

1

ネストされたcollections.defaultdictforを使用することをお勧めしchart_dictます。新しい値を設定するファクトリ関数を提供できるため、要求したキーは常に機能します。このように深くネストされた構造をセットアップするのは少し難しいですが、次のようにすると、4 レベルの構造に対して適切な処理が行われると思います (<value>現在のコードが期待しているように、アイテムも辞書であると想定しています)。

chart_dict = defaultdict(lambda:defaultdict(lambda:defaultdict(dict)))

それが整っていれば、キーのいずれかが以前に辞書内の何かを参照していたかどうかを心配することなく、次のことができるはずです。

a, b, c = passed_seq
chart_dict[a][b][c].update(err_sub_dict)

上記の変数のアンパックのようなことも行うことをお勧めしますが、おそらくab、よりも適切な名前を使用する必要がありますc。適切な変数名は、わかりにくいものを把握しやすいものに変えることができます。

于 2013-02-27T15:48:46.313 に答える
1

使用する必要があります

dict.setdefault()

ドキュメントを参照してください。

例:

d = {}
d = d.setdefault("k","eggs")

>> d["k"]
eggs

d2 = {"k":1}
d2 = d2.setdefault("k","spam")
>> d2["k"]
1
于 2013-02-27T14:02:58.487 に答える