2016-09-13 53 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

您將面臨字典中按鍵順序的問題。字典中的鍵(或鍵 - 值對)被任意排序。訂單不固定,可以在不同的步驟中更改。

要緩解此問題,您可以使用模塊collections中的OrderedDict

如果我明白你的問題,你想引入你的字典,並讓他們有相同的密鑰。如果在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}} 

我把所有的鍵在嵌套字典,然後創建不存在的值(他在最後輸出中爲零)。

+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} 

另外,如果你想從dict2複製鍵和值只有當關鍵是不是已經在dict1,然後

>>> 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}