10

私は次の辞書を持っています:

aDict = {
    "a" : {
        "b" : {
            "c1" : {},
            "c2" : {},
        }
    }
}

2番目の口述:

aSecondDict = { 
    "d1" : {},
    "d2" : {},
    "d3" : {},
}

および「パス」タプル:

path = ( "a", "b", "c2" )

タプルによって提供されるパスで、2 番目の dict を最初の dict に追加したいと思います。

aResultDict = {
    "a" : {
        "b" : {
            "c1" : {},
            "c2" : {
                "d1" : {},
                "d2" : {},
                "d3" : {},
            },
        }
    }
}

これを達成するためのPython的な方法は何ですか?

4

1 に答える 1

13

reduce1を使用して辞書を取得しdict.update、そこに新しいものを配置できます。

reduce(lambda d,key: d[key],path,aDict).update(aSecondDict)

必要に応じて、もう少し賢くすることもできます。

reduce(dict.__getitem__,path,aDict).update(aSecondDict)

2つのアプローチは少し異なることに注意する必要があると思います。後者aDictは、より多くの辞書 (またはdictサブクラス) のみを含むように強制しますが、前者は、__getitem__メソッドを持つものはすべて に含めることができますaDictコメントに記載されているように、次のものも使用できます。

reduce(dict.get,path,aDict).update(aSecondDict)

ただし、このバージョンAttributeErrorでは、存在しないパス内の「リンク」をトラバースしようとすると、 ではなく が発生するため、KeyErrorあまり好きではありません。このメソッドは、パスに沿ったすべての値がdictまたはdictサブクラスであることも強制します。

1reduceは python2.x のビルトインです。python2.6 以降では、としても利用できますfunctools.reducefunctools.reducepython3.xではビルトインが削除されているため、python3.x と互換性を持たせたいコードは使用を試みる必要があります。

于 2013-04-30T12:51:50.383 に答える