2017-08-05 52 views
0

我正在玩Python,試圖理解詞典。我知道之前有關於這個錯誤的問題已經被問到,但是他們並沒有幫助我理解我的問題。試圖理解詞典

我有以下代碼

mailSender = dict() 
count = 0 
name = input("Enter file:") 
handle = open(name) 
for line in handle: 
    line = line.rstrip() 
    if not line.startswith("From "): 
     continue 
    count = count + 1 
    senderNames = line.split() 
    # print(splitLines[1]) 
    print(senderNames[1]) 

    if senderNames not in mailSender: 
     mailSender[senderNames] = 1 
    else: 
     mailSender[senderNames] = mailSender[senderNames] + 1 

# print(mailSender) 

我想挑選出電子郵件地址的文本文件,然後找到NND是誰發送的郵件最多。

我不斷收到以下錯誤:

if senderNames not in mailSender: TypeError: unhashable type: 'list' 

我沒有經驗,看到我錯了,我希望有人能擺脫它的一些光。

+0

'senderNames'是一個列表。列表不可散列,因爲它們是可變的,並且字典鍵需要可排除。 –

回答

0

字典有2部分,keysvalues。每個key,指向value,這是像這樣做:

mailSender["[email protected]"] = 5 # This means, that [email protected] appears 5 times

當你試圖尋找一個發送者的名字,你需要在keys搜索的名字,所有的電子郵件被存儲,而不是整個字典,它是keysvalues的映射。您還需要在電子郵件列表中的senderNames(即電子郵件列表中的1)中指明您想要查找的電子郵件地址的位置。你能解決你的問題,通過改變你的代碼:

if senderNames[*index of name*] not in mailSender.keys(): 
    mailSender[senderNames] = 1 
else: 
    mailSender[senderNames] = mailSender[senderNames] + 1 

例如,你可以參考找到的第一個電子郵件地址是這樣的:

if senderNames[0] not in mailSender.keys(): 
    mailSender[senderNames] = 1 
else: 
    mailSender[senderNames] = mailSender[senderNames] + 1 

那麼它將搜索如果senderNames是鑰匙mailSender。希望這有助於!

+0

謝謝!我認爲這有助於我進一步移動! –

+0

不客氣!如果這對你有幫助,請考慮接受答案並在答案的左邊選中標記! @ o.fithcheallaigh – sccoding

+0

如果可以的話,我也會贊成你的回答!但是,迄今爲止,我做不到。非常感謝! –

0

問題是你使用的是senderNames,它是From和Whatnot的列表,而你可能正在尋找senderNames [1]這個名字。就像這樣 - 儘管你可能想將一些發件人名稱數組合併成一個字符串,但並不確定你的數據是什麼樣的。

for line in handle: 
    line = line.rstrip() 
    if not line.startswith("From "): 
     continue 
    count = count + 1 
    senderNames = line.split() 
    print(senderNames[1]) 
    name = senderNames[1] 

    if name not in mailSender: 
     mailSender[name] = 1 
    else: 
     mailSender[name] = mailSender[name] + 1 
+0

感謝您的幫助和解釋! –