4

一部のキーが値として他の辞書を持ち、それらの値の一部が値として持つ辞書のキーである辞書をループしようとしています。pyyaml を使用して 5000 行を超える YAML ファイルを解析しています。ロードすると、ファイル内のすべての辞書が作成され、すべてのサブレベルが独自の辞書に分割されます。

これは私が今使っているもので、辞書自体ではなく辞書のキーと値だけを取得します:

for k1,v1 in dataMap['eng'].items():
    if type(dataMap['eng'][k1]) == dict:
        for k2, v2 in dataMap['eng'][k1].items():
            if type(dataMap['eng'][k1][k2]) == dict:
                for k3, v3 in dataMap['eng'][k1][k2].items():
                    if type(dataMap['eng'][k1][k2][k3]) == dict:
                        print "key: {}, val: {}".format(k3, v3)
                    else:
                        print "key: {}, val: {}".format(k3, v3)
            else:
                print "key: {}, val: {}".format(k2, v2)
    else:
        print "key: {}, val: {}".format(k1, v1)

「eng」は、YAML ファイル内の他のすべてを保持する最上位レベルです。以下は、使用している YAML ファイルのサンプルです。ただし、実際のファイルには5000行以上あります

eng:
  value1: 
    v1: USA
    v2: Canada
    v3: Mexico
  value2:
    value3:
       value4: "some text here"
       value5:
          value6: "some text here"
          value7: " some other text here"
       value8: "some text here"
    etc..

こんな感じで延々と続く。値だけを持つキーもあれば、それ自体が辞書を持つ辞書を持つキーもあり、これはいくつかのレベルの深さになります。これを行うためのより良い簡単な方法があるかどうか疑問に思っているだけで、すべての for ループと if ステートメントで dict かどうかをチェックする方法で処理しています。最終的には、次のようなものが必要になります。

v1: USA
v2: Canada
v3: Mexico
value4: "some text here"
value6: "some text here"
value7: " some other text here"
value8: "some text here"
4

1 に答える 1