【问题标题】:Trying to understand dictionaries [duplicate]试图理解字典[重复]
【发布时间】:2018-01-13 09:29:27
【问题描述】:

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

我没有经验知道我哪里出错了,我希望有人能解释一下。

【问题讨论】:

  • senderNames 是一个列表。列表不可散列,因为它们是可变的,并且字典键需要是可散列的。

标签: python python-3.x dictionary traceback


【解决方案1】:

问题是您使用的是 senderNames,它是一个包含 From 和诸如此类的列表,而您可能正在寻找 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

【讨论】:

  • 感谢您的帮助和解释!
【解决方案2】:

字典有两个部分,keysvalues。每个key,指向一个value,这样做是这样的:

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

当您尝试查找发件人的姓名时,您需要在存储所有电子邮件的keys 中搜索姓名,而不是整个字典,这是keys 到@ 的映射987654328@。您还需要在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 的键中。希望这有帮助!

【讨论】:

  • 谢谢!我认为这帮助我走得更远!
  • 不客气!如果这对您有所帮助,请考虑使用答案左侧的复选标记接受此答案! @o.fithcheallaigh
  • 如果可以的话,我也会赞成你的回答!但是,到目前为止,我还不能。再次感谢!
  • 没关系,不是点赞,而是帮助别人理解!
猜你喜欢
  • 2021-01-04
  • 2022-01-17
  • 1970-01-01
  • 2017-09-09
  • 2014-04-10
  • 2023-03-10
  • 1970-01-01
  • 2020-10-22
  • 2019-03-04
相关资源
最近更新 更多