2017-03-03 7 views
2

私はこのコードを持って抽出値は

thedata = {'a': [B(1, 0.1),B(2, 0.2)], 
      'b': [B(3, 0.3),B(4, 0.4)]} 

私は何に辞書上からab属性を抽出されてやりたいですキーに応じて2つの新しい辞書。だから、

、私が欲しい:

thedata_a_valueA = {'a':[1, 2]} 
thedata_a_valueB = {'a':[0.1, 0.2]} 
thedata_b_valueA = {'b':[3, 4]} 
thedata_b_valueB = {'b':[0.3, 0.4]} 

、最終的に私は2つの辞書をしたい:

newdict_valueA = {'a':[1, 2], 'b':[3,4]} 
newdict_valueB = {'a':[0.1, 0.2], 'b':[0.3,0.4]} 

一つの解決策は、リストを使用するが、私はかなりの数のリストを作成する必要があり、それらの上のループ、追加でなど

thedataに取り組んでどのクリーナー/速く解決策はありますか?

+1

ドンPython辞書は重複キーをサポートしていないことを忘れないでください。したがって、newdict_valueBの例では、異なる値を持つ2つの 'b'キーを持つことはできません。 –

+0

@ MarkStreatfield:申し訳ありませんが、それはタイプミスでした。 – George

答えて

1

このような何かが動作します:

# Starting from two empty dictionaries 
newdict_valueA, newdict_valueB = {}, {} 

# Iterate over the key/value pairs of the data 
for key, value in thedata.items(): 
    # assign to the same key of each result dictionary a list of 
    # the valueA for each B item in the value of the original dictionary 
    newdict_valueA[key] = [item.valueA for item in value] 
    newdict_valueB[key] = [item.valueB for item in value] 

newdict_valueA:

{'a': [1, 2], 'b': [3, 4]} 

newdict_valueB:

{'a': [0.1, 0.2], 'b': [0.3, 0.4]} 
0

あなたは、各キーのリストの予想される項目のすべてを持つことができますあなたの辞書あなただけのvalueAvalueBに別々の項目が含まれていthedataの項目及び各キーは、辞書を作成するための上でループする必要があります。 dict.setdefault()属性は、このタスクに最適です。

In [18]: d = {} 

In [19]: for i, j in thedata.items(): 
      for instance in j: 
       d.setdefault(i, {}).setdefault('valueA', []).append(instance.valueA) 
       d.setdefault(i, {}).setdefault('valueB', []).append(instance.valueB)  

In [20]: d 
Out[21]: 
{'a': {'valueB': [0.1, 0.2], 'valueA': [1, 2]}, 
'b': {'valueB': [0.3, 0.4], 'valueA': [3, 4]}} 

あなたの代わりにdict.setdefault()方法collections.defaultdict()を使用することができ、よりきれいな方法としてあること注:私は右のあなたの質問を得た場合

In [33]: d = defaultdict(lambda: defaultdict(list)) 

In [34]: for i, j in thedata.items(): 
      for instance in j: 
       d[i]['valueA'].append(instance.valueA) 
       d[i]['valueB'].append(instance.valueB) 
    ....:   

In [35]: d 
Out[35]: defaultdict(<function <lambda> at 0x7fb5888786a8>, 
     {'a': defaultdict(<class 'list'>, 
       {'valueB': [0.1, 0.2], 'valueA': [1, 2]}), 
      'b': defaultdict(<class 'list'>, 
       {'valueB': [0.3, 0.4], 'valueA': [3, 4]})}) 
0

、あなたが内包表記を使用することができます。

newdict_valueA = { k : [ b.valueA for b in l ] for k, l in thedata.items() } 
newdict_valueB = { k : [ b.valueB for b in l ] for k, l in thedata.items() }