试图理解词典

时间:2017-08-05 15:54:45

标签: python python-3.x dictionary traceback

我正在玩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)

我正在尝试选择一个文本文件的电子邮件地址,然后查找谁发送了最多的电子邮件。

我一直收到以下错误:

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

我没有经验可以看到我哪里出错了,我希望有人可以对此有所了解。

2 个答案:

答案 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

答案 1 :(得分:0)

字典有两部分,keysvalues。每个key指向一个value,其执行方式如下:

mailSender["email@email.com"] = 5 # This means, that email@email.com appears 5 times

当您尝试查找发件人的姓名时,您需要在keys中搜索存储所有电子邮件的名称,而不是整个字典,这是{{1到keys。您还需要在values中指明要查找的电子邮件地址的位置,这是电子邮件列表中的一个。您可以通过将代码更改为:

来解决您的问题
senderNames

例如,您可以参考找到第一个电子邮件地址:

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。希望这有帮助!