2017-08-15 3 views
0

以下のようにネストされたJSON構造を想像:私は計算されたファイル名にノード変数内のすべてのファイル名を置き換えたい最短の方法

node = 
{ 
    "0" : { 
    "param" : { 
     "filename" : "abc", 
     "delimiter" : "n" 
    }, 
    "function" : "do something" 
    }, 
    "1" : { 
    "param" : { 
     "filename" : "def", 
     "delimiter" : "n" 
    }, 
    "function" : "do something" 
    }, 
    "2" : { 
    "param" : { 
     "filename" : "ghi", 
     "delimiter" : "n" 
    }, 
    "function" : "do something" 
    } 
} 

。たとえば、 "example.pdf"に "0"、 "1"、 "2"のfilenameの値をすべて置き換えたいとします。

Pythonで最もエレガントな方法や最短の方法は何ですか?

+0

'node = {new_key:vの_、vのnode.items()}' – erip

+0

まず自分で達成しようとしてください。 – Maroun

+0

単純な 'for'ループを書いてみませんか?試しましたか? – timgeb

答えて

1

どのように?

In [29]: import re 

In [30]: json.loads(re.sub('(?<="filename": ")(.*?)(?=")', 'example.pdf', json.dumps(node))) 
Out[30]: 
{'0': {'function': 'do something', 
    'param': {'delimiter': 'n', 'filename': 'example.pdf'}}, 
'1': {'function': 'do something', 
    'param': {'delimiter': 'n', 'filename': 'example.pdf'}}, 
'2': {'function': 'do something', 
    'param': {'delimiter': 'n', 'filename': 'example.pdf'}}} 

あなたはすべてのインスタンスを交換したくない場合、これは、動作しないでしょう。

+1

非常にクリエイティブなので、最初にjsonを解析する必要がなくなります(+1) –

+0

@UriGorenはい...利点は、サブコールバックで複雑な置換をサポートできることです...置き換えられるものを制御することができないために柔軟性がありません:) –

+1

クリエイティブな、1つのラインと洗練された。確かにエレガント! –

0

それはエレガントだ場合、私は知らないが、私はこれだろう:(の値に関係

for k,v in node.items(): 
    v["param"]["filename"]="foo{}.pdf".format(k) 

辞書のキー/値の反復、および関連分野に「移動」し、それを変更します説明するためのキー)

(辞書内包表記を使用して辞書を再構築することは行き過ぎここにいるようだ)正規表現について

0

あなたの鍵 "paramはいつも同じではない、あるいは未知の場合、あなたはこれを使用することができます:

for k1, v1 in node.items(): 
    for k2, v2 in v1.items(): 
     if 'filename' in v2: 
      node[k1][k2]['filename'] = 'example.pdf' 
0

を私は再帰的に

def override(node, key, val): 
    if type(node) != dict: 
     return node 
    new_node = dict() 
    for k, v in node.items(): 
      new_node[k] = override(v) if k != key else val 
    return new_node 

それを行うだろうその後

でそれを実行します
node = override(node, "filename", "example.pdf") 

"filename"がネストされていても動作します

関連する問題