2016-07-11 13 views
0

jsonやdictオブジェクトとして解析できる文字列があります。私の文字列変数は、次のようになります。重複キーで文字列からdict/jsonを作成するPython

my_string_variable = "{ 
          "a":1, 
          "b":{ 
           "b1":1, 
           "b2":2 
          }, 
          "b": { 
           "b1":3, 
           "b2":2, 
           "b4":8 
          } 
          }" 

私はjson.loads(my_string_variable)を行うと、私は辞書が、辞書に重複キーを含めることができないため、通常で保たれているキー「B」、の唯一の第2の値を持っています。私はすでに同様の質問を探しましたが、それらはすべて、入力としてdictsまたはリストに対処し、その後、処理するためにdefaultdictsを作成している

result = { 
       'a':1, 
       'b': [{'b1':1,'b2':2}, { 'b1':3, 'b2':2,'b4':8 } ] 
      } 

:何、このようなdefaultdictのいくつかの並べ替えを持ってするための最良の方法だろう

重複するキー私は、文字列変数を持っていると私はこれを達成するための簡単な方法があるかどうかを知りたいでしょう:)

私の場合は

では、次のような

+0

このスレッドを見てください:http://stackoverflow.com/questions/5946236/how-to-merge-multiple-dicts-with-same-key .itあなたが行くのを手伝ってください –

+1

おそらくありません。重複したキーを持つだけではマッピングに意味がない。キーに再び遭遇すると、単一値から複数値に切り替えるカスタムパーサーが必要になります。いくつかの努力を払って[JSONデコーダ](https://docs.python.org/3/library/json.html#encoders-and-decoders)を修正することができます。 * all *キーがシーケンス値を持つ場合(長さがちょうど1であっても)、物事はもっと簡単になることに注意してください。 – MisterMiyagi

+3

より多くの欺瞞のように見える: 'object_pairs_hook':http://stackoverflow.com/questions/14902299/json-loads-allows-duplicate-keys-in-a-dictionary-overwriting-the-first-value –

答えて

2

何かを行うことができます^^ありがとうございました。

import json 

def join_duplicate_keys(ordered_pairs): 
    d = {} 
    for k, v in ordered_pairs: 
     if k in d: 
      if type(d[k]) == list: 
       d[k].append(v) 
      else: 
       newlist = [] 
       newlist.append(d[k]) 
       newlist.append(v) 
       d[k] = newlist 
     else: 
      d[k] = v 
    return d 

raw_post_data = '{"a":1, "b":{"b1":1,"b2":2}, "b": { "b1":3, "b2":2,"b4":8} }' 
newdict = json.loads(raw_post_data, object_pairs_hook=join_duplicate_keys) 
print (newdict) 

上記のコードは、値のタイプ、if type(d[k]) == listに依存します。したがって、元の文字列自体がリストを提供する場合、コードを堅牢にするために必要なエラー処理が存在する可能性があります。

+0

ありがとう!これは私の問題を解決しました;) – Samiella

+0

タイプをチェックするのではなく、 'defaultdict(list)'を使うのでしょうか?あなたが言及している潜在的な問題も取り除きます。 – user1337

関連する問題