2017-08-16 5 views
0

後で投稿を行うために2つの辞書をマージしようとすると問題が発生します。何らかの理由でgetがネストされているように見えますが、どうやってそれをきれいにするのかわかりません。コードを最適化するためのヒントを得るのは素晴らしいことですが、今はちょっと面倒です。ネストされたキーを削除し、値をメインの辞書キーに移動させます

for network in networks: 

      post_dict = {e1:e2 for e1,e2 in network['extattrs'].iteritems() if e1 not in keys } 
      pprint (post_dict['Stuff-Name']['value']) 

      post_dict['name'] = post_dict.pop('Stuff-Name') 
      post_dict['sid'] = post_dict.pop('Stuff-id') 

      dict_to_post = merge_two_dicts(post_dict, default_keys) 

ネットワーク:

{u'_ref': u'ref number', 
u'comment': u'Name of object', 
u'extattrs': {u'Network-Type': {u'value': u'Internal'}, 
       u'Stuff-Id': {u'value': 110}, 
       u'Stuff-Name': {u'value': u'Name of object'}}, 
u'network': u'Subnet-A', 
u'network_view': u'default'} 

default_keys:

default_keys = {'status':'Active', 
       'group':None, 
       'site':'City-A', 
       'role':'Production', 
       'description':None, 
       'custom_fields':None, 
       'tenant':None} 

post_dict:

{'name': {u'value': u'Name of object'}, 
'sid': {u'value': 110}} 

それでは、私はachiveしたいことは、ネストされたキーを取り除くことである(内キー "name"と "sid"を使用して、キーと値p空気は「名前:オブジェクトの名前」と「sid:110」である必要があります。

投稿機能はまだ定義されていません。

+0

問題を再現するために必要なコードを投稿するようにしてください。 'ネットワークでのネットワークのための'のpythonループを '中断 'し、' network'、 'post_dict'と' default_keys'の正確な辞書を教えてください。 –

+0

コードを整理しました – Kirke

答えて

0

私の理解では、あなたのケースは本当に具体的であり、私はおそらく簡単な&汚れた解決策に行くだろう。まず第一に、あなたはこれを試してみました:

post_dict['name'] = (post_dict.pop('Stuff-Name'))['value'] 

第二に、どのように使用すること「フィルタをし、名前の変更」とそこにインデックスを崩壊について?これはお勧めできませんが、怠惰な回避策を講じようとしているのであれば十分です。あなたの問題を解決することができると私は確信しているので、私はあなたの最初の提案に行くことをお勧めします。

+0

このように見えます。はい、これは非常に具体的なので、これはうまく動作します、ありがとう! – Kirke

0

あなたはそれは私がそれは辞書が最初の場所で入れ子にすることが原因となっています。このステップだと思う

{'custom_fields': None, 'description': None, 'group': None, 'name': 'Name of 
object', 'role': 'Production', 'site': 'City-A', 'status': 'Active', 
'tenant': None, 'sid': 110} 

を返します。この

d = {'custom_fields': None, 'description': None, 'group': None, 'name': 
{'value': 'Name of object'}, 'role': 'Production', 'site': 'City-A', 
'status': 'Active', 'tenant': None, 'sid': {'value': 110}} 

for key in d.keys(): 
    if type(d[key]) == dict: 
    d[key] = d[key].popitem()[1] 

を使用することができます任意のネストされた辞書のこの最初の値を取得するために

post_dict['name'] = post_dict.pop('Stuff-Name') 
post_dict['sid'] = post_dict.pop('Stuff-id') 

ここでpopitem()[1]を試すことができます辞書であり、鍵ではない。

+0

あなたが定義したものでうまく動作するようです。コードでそれを使用するかの別の結果をもたらす: { 'custom_fields':なし、 '記述':なし、 'グループ':なし、 '名称':{}、 'ロール': '生産'、 'site': 'City-A'、 'ステータス': 'アクティブ'、 'テナント':なし、 'sid':{}} – Kirke

関連する問題