2014-03-04 54 views
1

作爲使用Python的初學者,我試圖使用if語句使用值填充字典。如果您有任何意見,爲什麼這不起作用,我會很感激您的意見。馬哈洛提前!從列表中使用條件填充字典

#first list 
groslist = [0, 1, 2, 3] 
#dictionary whose keys are items in grosList 
grosdict = {k:[] for k in groslist} 
#second list whose items correspond with dictionary's keys 
indivlist = [0, 0, 1, 0, 1, 1, 1, 2, 2, 2, 2, 3, 3] 
#third list whose nth item ID corresponds indivlist 
indivIDlist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] 

#Populate dictionary with indivIDlist values (dict keys correspond with indivlist items) 
for ID in indivlist: 
    for ID in groslist: 
     x = 0; 
     if indivlist[x] == groslist[x]: 
      grosdict[indivlist[x]] = indivIDlist[x]; 
     x += 1 

這裏是我的理想輸出:

print CG_IDdict 
{0: [0, 1, 3], 1: [2, 4, 5, 6], 2: [7, 8, 9, 10], 3: [11, 12]} 
+2

初學者的不錯代碼:D –

+1

什麼是'CI_refCG_IDlist','CG_IDlist'和'CG_IDdict'? –

+2

沒有太多的分析。對於外部循環和內部循環,您都使用變量'ÌD'。這可能是問題所在。 (nvm,你甚至沒有使用變量) – M4rtini

回答

1

望着預期的輸出,這似乎是你想要做什麼。

for key, value in zip(indivlist, indivIDlist): 
    grosdict[key].append(value) 
print grosdict 
#{0: [0, 1, 3], 1: [2, 4, 5, 6], 2: [7, 8, 9, 10], 3: [11, 12]} 

zip功能。組了兩個列表的的元素結合在一起是這樣的:

[(0, 0), (0, 1), (1, 2), (0, 3), (1, 4), (1, 5), (1, 6), (2, 7), (2, 8), (2, 9), (2, 10), (3, 11), (3, 12)] 

,然後循環槽這個名單我們的價值,以及相應的鍵,將它們插入到字典中。

看看原來的代碼。那裏有一些問題。

  • 兩個嵌套循環中的變量名稱相同。
    • Altough你不使用這些變量,你應該
  • 你在每一個循環的開始重置變量x爲零。
  • 您正在嘗試使用相同的變量爲不同長度的不同列表建立索引。
  • 您正在分配(替換)匹配值,而不是附加它們。

該修改的代碼給出了相同的結果。

x = 0 
for ID_indiv in indivlist: 
    for ID_grod in groslist: 
     if ID_indiv == ID_grod: 
      grosdict[ID_indiv].append(indivIDlist[x]) 
    x += 1 

,或者你可以做一個小的修改,然後使用enumerate

for x, ID_indiv in enumerate(indivlist): 
    for ID_grod in groslist: 
     if ID_indiv == ID_grod: 
      grosdict[ID_indiv].append(indivIDlist[x]) 
0
import collections 

groslist = [0, 1, 2, 3] 

grosdict = collections.defaultdict(list) # Uses the standard library’s default dictionary type. 

indivlist = [0, 0, 1, 0, 1, 1, 1, 2, 2, 2, 2, 3, 3] 
indivIDlist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] 

for key, value in zip(indivlist, indivIDlist): 
    grosdict[key].append(value) 

assert grosdict == {0: [0, 1, 3], 
        1: [2, 4, 5, 6], 
        2: [7, 8, 9, 10], 
        3: [11, 12]} 

print(dict(grosdict)) 

使用內置在像M4rtini zip函數聲明可能是最優雅的解決方案。使用標準庫的defaultdict類型,代替字典理解也可能有所幫助。