2014-11-20 53 views
1

我有以下的列表工作正常,但最後的印刷是borked,我無法讓計數器儘快在每個列表中返回正確數量的項目因爲我的字典中有一個以上的密鑰!它應該告訴我有多少人選擇了特定的甜點作爲他們的最愛。將列表中的項目用作字典值

desserts = {} 

name_vote = input ('Name:vote ') 

while name_vote != '': 
    no_colon_name_vote = name_vote.replace(":", " ") 
    listed_name_vote = no_colon_name_vote.split() 
    name = listed_name_vote[0] 
    vote = ' '.join(listed_name_vote[1:]) 
    if vote not in desserts: 
    desserts[vote] = [name] 
    else: 
    desserts[vote].append(name) 
    name_vote = input ('Name:vote ') 

for dessert in desserts: 
    count = sum(len(entries) for entries in desserts.values()) 
    print(dessert, count,'vote(s):',' '.join(desserts[dessert])) 

所需的輸出:

apple pie 1 vote(s): Georgina 
gelato 2 vote(s): Sophia Kirsten 
chocolate 3 vote(s): Greg Will James 

而是我得到設定爲6的所有三個值!

回答

1

下面是一個簡單的版本,它應該工作正常:

from collections import defaultdict 

desserts = defaultdict(list) 

while True: 
    name_vote = input('Name:vote ') 
    if name_vote == '': 
     break 
    name, vote = name_vote.split(':') 
    desserts[vote].append(name) 

for dessert, names in desserts.items(): 
    print(dessert, len(names), 'vote(s):', ' '.join(names)) 

注意簡單的字符串分裂碼,以及如何做while循環like this意味着你可以避免重複設置代碼行。此外,使用defaultdict並遍歷字典items()也簡化了代碼

+0

非常感謝!我開始看到我的邏輯是正確的,但我必須更好地提高代碼的效率!早些年!! – Mathmos 2014-11-21 08:46:53

+0

我假設defaultdict是一種「腳手架」代碼的方式,這樣一個正確格式的空白字典(在這種情況下值作爲列表)已準備就緒,並且正在等待填充儘可能小的障礙物? – Mathmos 2014-11-21 08:53:07

+0

是的,這是一個快捷方式,如果你嘗試訪問一個尚未添加的鍵,它將使用提供的'默認函數'爲你創建一個......在我們的例子中是'list'構造函數。所以你可以跳過'如果存在'檢查,只是把它看作總是有一個列表準備好你 – Anentropic 2014-11-21 10:12:23

0

count基於整個desserts列表sum而不是desserts[dessert]

試試這個:

count = len(desserts[dessert]) 

還要考慮使用defaultdict


讓我們退後一步,試試這個來代替:

desserts = collections.defaultdict(list) 
while name_vote != '': 
    name_vote = input('Name:vote ') 
    if not name_vote: 
     break 
    name, vote = no_colon_name_vote.split(':') 
    desserts[vote].append(name) 

for dessert in desserts: 
    count = len(desserts[dessert]) 
    print(dessert, count,'vote(s):',' '.join(desserts[dessert])) 
+0

試過了,它返回名稱中的字符總數,而不是每個列表中的名稱數。但至少它們並不都是一樣的價值!不熟悉default.dic。我正在通過的教程還沒有涉及,但我會做一些研究。 – Mathmos 2014-11-20 20:27:35

+0

糾正了答案。 – 2014-11-20 20:28:56

+0

明星人:)歡呼聲! – Mathmos 2014-11-20 20:31:03

相關問題