2016-09-13 19 views
0

に辞書の値を変換:私は辞書を持って新しい辞書

{ 
    'doc0': { 
     'individu': 1, 
     'manajemen': 1, 
     'tahu': 1, 
     'logistik': 1, 
     'transaksi': 1 
    }, 
    'doc1': { 
     'manajemen': 1, 
     'transfer': 1, 
     'individu':1, 
     'tahu':1, 
     'transaksi': 1, 
     'logistik': 1 
    }, 
    'doc2': { 
     'manajemen': 1, 
     'logistik': 1, 
     'transaksi': 1 
    } 
} 

私は新しい辞書で以下にそれを変換するためのPythonを使用したい:

{ 
    'doc0': { 
     'individu': 1, 
     'manajemen': 1, 
     'tahu': 1, 
     'logistik': 1, 
     'transaksi': 1, 
     'transfer':0 
    }, 
    'doc1': { 
     'individu': 1, 
     'manajemen': 1, 
     'tahu': 1, 
     'logistik': 1, 
     'transaksi': 1 
    }, 
    'doc2': { 
     'individu': 0, 
     'manajemen': 1, 
     'tahu': 0, 
     'logistik': 1, 
     'transaksi': 1, 
     'transfer':0 
    } 
} 
+1

私はあなたが達成しようとしているのか分かりません。あなたは少しあなたの質問を詳しく説明できますか? – user1252280

+0

データ変換を実行するために使用するルールを記述できない限り、誰もあなたの手助けをすることはできません。 – jwpfox

答えて

0

辞書のキーの順序に問題があります。辞書内のキー(またはキーと値のペア)は、任意にソートされます。注文は固定されておらず、異なるステップで変更することができます。

この問題を軽減するには、モジュールcollectionsOrderedDictを使用します。

私があなたの問題を理解していれば、辞書を並べて同じキーにしたいと思っています。 doc1に鍵があるが、doc2に鍵がない場合は、doc2をこの鍵と値0で更新する必要があります。そうであれば、値ではなく鍵を複製したいと思うでしょう。

これは私の試みです:

from collections import OrderedDict 

# your initial data 
my_dict = { 
    'doc0': { 
     'individu': 1, 
     'manajemen': 1, 
     'tahu': 1, 
     'logistik': 1, 
     'transaksi': 1 
    }, 
    'doc1': { 
     'manajemen': 1, 
     'transfer': 1, 
     'individu':1, 
     'tahu':1, 
     'transaksi': 1, 
     'logistik': 1 
    }, 
    'doc2': { 
     'manajemen': 1, 
     'logistik': 1, 
     'transaksi': 1 
    } 
} 

# get all keys in a help list 
list_of_keys = [] 
for key in my_dict: 
    for dockey in my_dict[key]: 
     if dockey not in list_of_keys: 
      list_of_keys.append(dockey) 
# sort the list 
list_of_keys.sort() 
# the list looks like this 
# ['individu', 'logistik', 'manajemen', 'tahu', 'transaksi', 'transfer'] 

# now we can iterate through our data 
# and align the keys and values in an OrderedDict 

my_ordered_dict = OrderedDict() 
# get the doc keys and update the ordered dictionary 
for key in my_dict: 
    my_ordered_dict.update([(key, OrderedDict())]) 

for i in list_of_keys: 
    for key in my_dict: 
     if i in my_dict[key].iterkeys(): 
      my_ordered_dict[key].update([(i, 1)]) 
     else: 
      my_ordered_dict[key].update([(i, 0)]) 

今、あなたはすべての辞書内のすべてのキーを持って、それらがソートされ、順序は保持されます。初期データは変更されません。

私はリスト内包、三項演算子などの高度な機能を使用しませんでした。あなたが初心者であるため、アプローチはちょっと素朴でシンプルです。あなたがすべてのステップを理解しやすくなると思います。

私はそれがあなたを助けることを願っています。

+0

あまりにもありがとう:)ええ、これは私が意味するものです。あなたの助けに感謝:)それは私のために働く –

+0

私はそれが助けてうれしいです。他の答え、特に 'set'も見てください。ソリューションを強化するのに役立ちます。回答を選択することで、質問に回答としてマークすることができます。 – cezar

0

あなたが見ることができます

>>> all = list(set([j for i in list(d.keys()) for j in list(d[i].keys())])) 

>>> all 
['transfer', 'tahu', 'transaksi', 'individu', 'manajemen', 'logistik'] 

>>> for k in all: 
    for j in list(d.keys()): 
     if not k in d[j].keys(): 
      d[j][k]=0 

>>> d 
{'doc0': {'individu': 1, 
    'logistik': 1, 
    'manajemen': 1, 
    'tahu': 1, 
    'transaksi': 1, 
    'transfer': 0}, 
'doc1': {'individu': 1, 
    'logistik': 1, 
    'manajemen': 1, 
    'tahu': 1, 
    'transaksi': 1, 
    'transfer': 1}, 
'doc2': {'individu': 0, 
    'logistik': 1, 
    'manajemen': 1, 
    'tahu': 0, 
    'transaksi': 1, 
    'transfer': 0}} 

ネストされた辞書のすべてのキーを取得して、存在しない値を作成します(he最後の出力のゼロを無視します)。

+0

ありがとう、あなたの答えはまた私のために働く、それは本当に私を助けた –

0

あなたが達成しようとしていることは完全にはっきりしていませんが、dict2のすべてのキー/値ペアをdict1に追加するか、dict1で更新するようにするにはdict1.update(dict2)を実行します。例:

また
>>> dict1={"apples":14, "bananas":22} 
>>> dict2={"apples":4, "pears":7} 
>>> dict1.update(dict2) 
>>> dict1 
{'apples': 4, 'bananas': 22, 'pears': 7} 

あなたは鍵がdict1になっていない場合にのみdict2からキーと値をコピーしたい場合は、その後、

>>> dict1={"apples":14, "bananas":22} 
>>> dict2={"apples":4, "pears":7} 
>>> for k in set(dict2.keys()) - set(dict1.keys()): 
>>>  dict1[k]=dict2[k] 
... 
>>> dict1 
{'apples': 14, 'bananas': 22, 'pears': 7} 
関連する問題