1

Python辞書に動的レベルのネストを作成する関数を作成したいと思います。たとえば、関数nestingを呼び出す場合、次のような出力が必要です。

nesting(1)  :  dict = {key1:<value>}
nesting(2)  :  dict = {key1:{key2:<value>}}
nesting(3)  :  dict = {key1:{key2:{key3:<value>}}}

等々。この関数を呼び出す前にすべてのキーと値を持っていますが、コードの実行を開始する前ではありません。

キーを変数「m」に格納しています。ここで、mは次の式から取得されます。

m=re.match(pattern,string)

この場合、パターンは動的に構築されます。

4

2 に答える 2

1

次のようにキーを反復処理できます。

def nesting(level):
    ret = 'value'
    for l in range(level, 0, -1):
        ret = {'key%d' % l: ret}
    return ret

range(...)フラグメントを、目的の順序でキーを生成するコードに置き換えます。したがって、キーがキャプチャされたグループであると想定する場合は、次のように関数を変更する必要があります。

def nesting(match): # `match' is a match object like your `m' variable
    ret = 'value'
    for key in match.groups():
        ret = {key: ret}
    return ret

またはreversed(match.groups())、逆の順序でキーを取得する場合に使用します。

于 2013-02-07T07:27:06.683 に答える
1
def nesting(level, l=None):
    # assuming `m` is accessible in the function
    if l is None:
        l = level
    if level == 1:
        return {m[l-level]: 'some_value'}
    return {m[l-level]: nesting(level-1, l)

妥当なlevelsの場合、これは再帰の深さを超えることはありません。これは、値が常に同じでありm、次の形式であると想定しています。

['key1', 'key2', ...]

この関数の反復形式は、次のように記述できます。

def nesting(level):
    # also assuming `m` is accessible within the function
    d = 'some_value'
    l = level
    while level > 0:
        d = {m[l-level]: d}
        level -= 1
    return d

または:

def nesting(level):
    # also assuming `m` is accessible within the function
    d = 'some_value'
    for l in range(level, 0, -1):  # or xrange in Python 2
        d = {m[l-level]: d}
    return d
于 2013-02-07T07:39:47.277 に答える