2013-08-19 123 views
1

嘿,我已經在下面的Python代碼疑問,我寫道:Python字典理解迭代器

#create a list of elements 
#use a dictionary to find out the frequency of each element 
list = [1,2,6,3,4,5,1,1,3,2,2,5] 
list.sort() 
dict = {i: list.count(i) for i in list} 
print(dict) 

在字典壓縮方法,「因爲我在名單」提供給正確的方法的順序?所以它需要1,2,3,4 ..作爲關鍵。我的問題是爲什麼不需要三次?因爲我已經說過「我在列表中」,是否需要將列表中的每個元素都作爲關鍵字?

(我是新來的Python這樣很容易對我!)

+5

順便說一句,你應該查看'collections.Counter'。 –

回答

5

是的,您的懷疑是正確的。在迭代期間,1將出現3次。但是,由於字典具有唯一鍵,每次出現1時,它都會用新生成的鍵/值對替換先前生成的鍵/值對。這將給出正確的答案,這不是最有效的。您可以在列表轉換爲一個設置來避免再處理重複鍵:

dict = {i: list.count(i) for i in set(list)} 

然而,即使這種方法效率極其低下的,因爲它全傳過來的名單列表中,即O(每個價值N² )總比較。你可以在一個單一的傳過來的名單做到這一點,但你不會使用字典理解:

xs = [1,2,6,3,4,5,1,1,3,2,2,5] 
counts = {} 
for x in xs: 
    counts[x] = counts.get(x, 0) + 1 

counts結果是:{1: 3, 2: 3, 3: 2, 4: 1, 5: 2, 6: 1}

編輯:我不知道有在圖書館爲你做這件事。您應該使用Rohit Jain的解決方案collections.Counter代替。

+0

感謝您的輸入!問題是我的任務需要我用字典來查找頻率。所以我不能實現你提供的其他方法。 – Shonu93

7

我的問題是,爲什麼不要花1個三倍?

這是因爲字典鍵是唯一的。如果爲同一個鍵找到另一個條目,則該鍵的先前值將被覆蓋。

那麼,對於您的問題,如果你是隻計算在你的列表中的每個元素的頻率後,那麼你可以使用collections.Counter

請不要使用list變量名。這是一個內置的。

>>> lst = [1,2,6,3,4,5,1,1,3,2,2,5] 
>>> from collections import Counter 
>>> Counter(lst) 
Counter({1: 3, 2: 3, 3: 2, 5: 2, 4: 1, 6: 1}) 
+0

感謝您的輸入。請記住它。 – Shonu93