2011-12-12 63 views
-1

我需要採取的列表,並使用字典編目其中特定項目列表中的出現,作爲一個例子:字典和列出在列表中的字的位置

L = [「一個」, 'b', 'C', 'b', 'C', 'A', 'E']

字典需要包含以下內容:

d = { '一個' :0,5,'b':1,3,'c':2,4,'e':6}

但是,如果我用我寫的:

for i in range(len(word_list)): 
    if D.has_key('word_list[i]') == False: 
     D['word_list[i]'] = i 
    else: 
     D[word_list[i]] += i 

然後我得到一個KeyError異常的某個單詞,我不明白爲什麼我應該得到一個錯誤。

+0

炫耀:'d =字典((K,圖(operator.itemgetter,V)),用於(1) k,v in(itertools.groupby(sorted(x [:: - 1] for x in enumerate(L)),operator.itemgetter(0))))' –

回答

4

我你改性溶液中的位工作

word_list = ['a', 'b', 'c', 'b', 'c', 'a', 'e'] 
dict = {'a': [], 'b': [], 'c': [], 'e': []} 
for i in range(len(word_list)): 
    if word_list[i] not in dict: 
     dict[word_list[i]] = [i] 
    else: 
     dict[word_list[i]].append(i) 

結果

{'a': [0, 5], 'c': [2, 4], 'b': [1, 3], 'e': [6]} 
+2

你的代碼可以工作,但它需要一些注意:(1)你不需要預先填充你的字典 - 你的代碼確實爲單詞出現時創建了新的鍵;(2)你應該在for中使用「enumerate」將每個單詞的內容都作爲它的索引號,例如'for i,word in enumerate(word_list)';(3)不要在Python代碼中使用'dict'作爲變量名,因爲它是字典類名 - 這會變成陰影 – jsbueno

+0

啊哈謝謝你!但是我唯一的問題是:如果你添加新的條目,如果該條目不存在於字典中,我sn't: dict = {'a':[],'b':[],'c':[],'e':[]} 多餘的?我只問,因爲我可能需要修改此代碼以列出書中單詞的位置,並且我將無法列出出現這樣大量單詞的每個單詞。然後再次,我知道很少的Python,但它似乎與遺漏的字典行工作。 再次感謝! –

+0

我沒有看到jsbueno的評論出現,該死。 –

6
if D.has_key('word_list[i]') == False: 

呃,什麼?

最起碼,你應該放棄引號:

if D.has_key(word_list[i]) == False: 

但是你也濫用了一些Python的結構:

  1. 爲什麼總結指數?
  2. 你爲什麼要比較假?
  3. 你不是應該使用setdefault

像這樣:

for i in range(len(word_list)): 
    D.setdefault(word_list[i], []).append(i) 
+0

然後拼寫'if word_list [i] not in d:'。 – geoffspear

+0

我原來是這樣的,但是從我可以告訴它的每一次出現的索引加起來,而不是列出它們。我在編程失敗。 –

+0

@GeorgeBurrows - 你想要做什麼?我發佈的代碼會將x的值設置爲x出現的所有索引列表。 – Malvolio

2

我認爲這將是你的問題的解決最短:

>>> from collections import defaultdict 
>>> D = defaultdict(list) 
>>> for i,el in enumerate(L): 
    D[el].append(i) 

>>> D 
defaultdict(<type 'list'>, {'a': [0, 5], 'c': [2, 4], 'b': [1, 3], 'e': [6]}) 

如果你想堅持與dict,糾正你的代碼我會想出:

>>> D = {} 
>>> for i,el in enumerate(L): 
    if el not in D: 
     D[el] = [i] #crate a new list 
    else: 
     D[el].append(i) #appending to the existing list 


>>> D 
{'a': [0, 5], 'c': [2, 4], 'b': [1, 3], 'e': [6]} 

此外,還有在一個dict方法setdefault可用於:

>>> D = {} 
>>> for i,el in enumerate(L): 
    D.setdefault(el,[]).append(i) 


>>> D 
{'a': [0, 5], 'c': [2, 4], 'b': [1, 3], 'e': [6]} 

不過我更喜歡使用defaultdictcollections