2014-10-17 89 views
0

我在Python中有一些嵌套的字典,需要一些幫助才能讓我的代碼完全工作。將值插入到嵌套字典

首先代碼:

data = {} 

def insertIntoDataStruct(country, state,job,count,dict): 
    if country in dict: 
     dict[country][state] = {job: count} 
    elif country not in dict: 
     dict[country] = {state: {job: count}} 
    elif state not in dict[country]: 
     dict[country] = {state: {job: count}} 
    elif job not in dict[country][state]: 
     dict[country][state][job] = count 
    else: 
     dict[country][state][job] += count 


insertIntoDataStruct("US", "TX", 1234, 1, data) 
insertIntoDataStruct("IN", "KERELA", 1234, 1, data) 
insertIntoDataStruct("IN", "KERELA", 1234, 1, data) 
insertIntoDataStruct("US", "TX", 12345, 1, data) 
insertIntoDataStruct("US", "MI", 1234, 1, data) 
insertIntoDataStruct("IN", "M", 1234, 1, data) 

print data 

目前,它打印此:

{'US': {'MI': {1234: 1}, 'TX': {12345: 1}}, 'IN': {'M': {1234: 1}, 'KERELA': {1234: 1}}} 

它的字典,是在外部層面,國家,內部級,狀態,內部級,職務:計數

由於KERELA 1234應該有一個2,所以計數不能正確工作,然後它所做的就是用已經在dictiona中的狀態替換最新狀態RY。例如TX 1234不會顯示,因爲它後來被TX 12345替換掉

感謝您提前提供的所有幫助!

+1

因爲與KERELA,首要條件第二個電話'如果國家字典:'是真實的。 – njzk2 2014-10-17 15:19:42

+1

你的代碼真的很奇怪。首先你檢查一個項目是否在字典中,而不是檢查它是否在字典中。換句話說,這將是唯一可行的兩種情況。 – 2014-10-17 15:20:22

+0

@AndyP我編輯了我的答案,以添加一個替代方法來做到這一點。 – parchment 2014-10-17 15:36:56

回答

2

你的功能需要一定的修復,試試這個:

def insertIntoDataStruct(country, state,job,count,dict): 
    if country not in dict: 
     dict[country] = {state: {job: count}} 
    elif state not in dict[country]: 
     dict[country][state] = {job: count} 
    elif job not in dict[country][state]: 
     dict[country][state][job] = count 
    else: 
     dict[country][state][job] += count 

這也可能是您最初的意思,如果國家不存在,那麼創建它,否則,如果狀態不存在,等等。 。

這樣做的另一種方法是用defaultdict

from collections import defaultdict, Counter 
jobsdict = defaultdict(lambda: defaultdict(Counter)) 
jobsdict['US']['TX']['1234'] += 1 
+0

(順便說一下,你可以看看collections.Counter的工作計數器) – Cld 2014-10-17 15:24:19

+0

嗯,實際上這可以實現爲一些'defaultdict's。感謝您提醒我@Cld集合 – parchment 2014-10-17 15:33:56