2013-08-01 35 views
0

輸入字典數據我有我想要一本字典合併以下兩個數組:從兩個數組

# Input: 
wrd = ['i', 'am', 'am', 'the', 'boss', 'the', 'tiger', 'eats', 'rice', 'eats', 'grass'] 
cnt = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
# Output: 
{ 
    'i': [0], 
    'am': [1,2], 
    'the': [3,5], 
    'boss': [4], 
    'tiger': [6], 
    'eats': [7,9], 
    'rice': [8], 
    'grass': [10] 
} 

我曾嘗試下面的代碼,但我認爲我的想法是導致我錯了方式:

dict={} 
    j=0 
    for i in wrd: 
     if i in dict: 
      dict[i].insert(cnt[j]) 
     else: 
      dict[i].append(cnt[j]) 
      j+=1 

    v=dict.values() 
    k=dict.keys() 
    for k,v in dict.items(): 
     print k,v 

由於我是Python新手,我承認我缺乏這方面的知識。

+1

你的代碼有什麼問題?它會給出任何錯誤嗎?它會輸出錯誤嗎? –

+0

@RohitJain:錯誤:dict [i] .append(cnt [j]).... KeyError:'i' – sabu

回答

3

使用了合適的工具(在這裏,defaultdict,如Sukrit卡爾拉的答案)始終是最好的解決方案。但瞭解你的嘗試有什麼問題也很有用。

if i in dict: 
    dict[i].insert(cnt[j]) 
else: 
    dict[i].append(cnt[j]) 
    j+=1 

如果i已經在dict,這很好:dict[i]是一個列表,你會打電話給insert就可以了。這不會起作用,但僅僅是因爲insert需要兩個參數 - 插入對象的索引以及要插入的對象。只需將其更改爲append(cnt[j])insert(0, cnt[j])或適當的任何內容即可。

但如果i不在dict已經,你想append的東西,不存在。這顯然是行不通的。您必須先創建list並將其放入dict[i],然後才能對dict[i]執行任何操作。所以,你可以把這條線改成:

dict[i] = [cnt[j]] 

......那就解決了。

而且一旦你明白這一點,你可以希望瞭解爲什麼Sukrit卡爾拉的回答是太酷了:一個defaultdict只是一個dict自動創建不存在任何鍵的默認值。所以,你可以寫dict[i].append(cnt[j]),無論dict[i]是否已經存在,它都可以工作。


作爲一個方面說明,命名字典dict是一個壞主意,因爲這隱藏同名的內置類和構造。

更一般地說,它總是有助於使用更好的名稱。使用您隱蔽的縮寫和單字母名稱保存的按鍵將不再被您浪費調試代碼的鍵盤輸入取消,並向需要尋求幫助的人員解釋。調用輸入類似wordscounts,外循環變量word,該j櫃檯像count_index

同時:cnt幾乎是完全無用的。對於高達10的任何數字,cnt[j]只是j,對於任何超過10的數字,它是IndexError。爲什麼不使用j

3

在這裏使用collections.defaultdict。看到的片段

>>> wrd=['i','am','am','the','boss','the','tiger','eats','rice','eats','grass'] 
>>> cnt=[0,1,2,3,4,5,6,7,8,9,10] 
>>> from collections import defaultdict 
>>> a = defaultdict(list) 
>>> for key, val in zip(wrd, cnt): # Preferably for val, key in enumerate(wrd): 
     a[key].append(val) 


>>> a 
defaultdict(<type 'list'>, {'grass': [10], 'i': [0], 'am': [1, 2], 'eats': [7, 9], 'boss': [4], 'tiger': [6], 'the': [3, 5], 'rice': [8]}) 
>>> a['am'] 
[1, 2] 
>>> a['the'] 
[3, 5] 
+0

非常感謝您簡單直接的解決方案。 – sabu

1

您不需要創建計數器列表。枚舉會爲你做它:

list(enumerate(['i','am','am','the','boss','the','tiger','eats','rice','eats','grass'])) 
#=> [(0, 'i'), (1, 'am'), (2, 'am'), (3, 'the'), (4, 'boss'), (5, 'the'), (6, 'tiger'), (7, 'eats'), (8, 'rice'), (9, 'eats'), (10, 'grass')] 

現在,您可以用defaultdict收集這些了起來:

collect = defaultdict(list) 
for idx, wrd in enumerate(['i','am','am','the','boss','the','tiger','eats','rice','eats','grass']): 
    collect[wrd].append(idx) 

但是,真正的問題是,爲什麼你需要這個。你將如何處理這些指標回原始列表?