【问题标题】:Python KeyError in a dictionary containing a list包含列表的字典中的 Python KeyError
【发布时间】:2014-05-21 19:39:40
【问题描述】:

谁能告诉我为什么那个函数会给我一个 KeyError?

def countLinks(url):
    urlCounter = {"dummy":[0,0]}
    urlList = getLinks(url)
    for x in urlList:
        if x in urlCounter:
            urlCounter[x][1] += 1
        else:
            urlCounter[x][1] = 1
    return urlCounter

getLinks 只返回一个包含 HTML 链接的列表。

第二个值的原因是我需要跟踪这个 URL 是否被抓取。

顺便说一句,使用了 Python 3.0。

提前多谢

【问题讨论】:

  • if x (not) in urlCounter:urlCounter[x][1] = 1 当您知道密钥不在字典中时,您正在访问它。难怪有keyerror。
  • 该死的,没有列表作为它工作的值,只是添加了那个键和值。谢谢你的提示,我想我可能知道一个解决方案:-)
  • def countLinks(url): urlCounter = {"dummy":[0,0]} urlList = getLinks(url) for x in urlList: if x in urlCounter: urlCounter[x][0] += 1 else: urlCounter[x] = [1,0] return urlCounter
  • @sadoMasupilami 那是因为dict[x] = y 将在字典中创建条目。在您的示例中,您正在列表中设置一个值,但要访问该值,您需要通过键访问该列表。一把不存在的钥匙。
  • 其他:urlCounter[x] = [1,0]

标签: python dictionary keyerror


【解决方案1】:
for x in urlList:
        if x in urlCounter:
            urlCounter[x][1] += 1
        else:
            urlCounter[x][1] = 1  # you need to create the dict entry here too.

在这种情况下,当检查 dict 是否有键并在没有键时创建它,记住创建它很重要。

for x in urlList:
        if x in urlCounter:
            urlCounter[x][1] += 1
        else:
            urlCounter[x] = [0,1]

【讨论】:

  • 这正是我所缺少的!冰雹堆栈溢出:-)
  • 使用collections.Counter 或至少使用defaultdict 会更符合Python 习惯。
  • 我只是一个初学者,但我会看看这个!
  • @sadoMasupilami 我强烈建议你这样做——它们正是为此目的而制作的。 defaultdict 使用默认值初始化一个键,如果你插入一个还没有的键,Counter 是一个更专业的defaultdict 用于...计数。
猜你喜欢
  • 1970-01-01
  • 2018-09-13
  • 2016-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多