2

いくつかの大きなネストされた辞書からいくつかの値を取得する必要があります。怠惰な私は、最後の子が見つかるか、リーフが空になるまで、自分自身を再帰的に呼び出す関数を作成することにしました。

辞書が飛び出し、新しい呼び出しごとに新しい辞書が構築されるので、これがどれほど効率的か疑問に思います。

助言がありますか?

def recursive_dict_get(item, string, default=False):
    if not isinstance(item, dict):
        return default

    print "called with ", item, "and string", string
    if "." in string:
        attrs = string.split(".")
        parent = attrs.pop(0)
        rest = ".".join(attrs)
        result = item.get(parent, None)
        if result is None:
            return default
        else:
            return recursive_dict_get(item.get(parent, default), rest, default)
    else:
        return item.get(string, default)

---

foo = {
            "1": {
                "2": {
                    "3": {
                        "4":{
                            "5": {
                                "6": {
                                    "7": "juice"
                                }
                            }
                        }
                    }
                }
            }
        }

print recursive_dict_get(foo, "1.2.3.4.5.6.7", False)
print "*" * 3       
print recursive_dict_get(foo, "1.2.3.4.5.6", False)
print "*" * 3
print recursive_dict_get(foo, "1.3", False)
4

3 に答える 3

5

split()私が持っている 1 つの提案は、2 番目の引数を与えることです。次のような簡単なことを行うことができます。

parent, rest = string.split(".", 1)

それ以外には、コードに差し迫った問題は見られません。

再帰なしでこれを行うこともできます:

def recursive_dict_get(item, string, default=False):
    for s in string.split('.'):
        if (isinstance(item, dict) and s in item):
            item = item[s]
        else:
            return default
    return item
于 2013-08-20T15:32:18.500 に答える