gpt4 book ai didi

Python Dictionary.get() 默认返回不起作用

转载 作者:行者123 更新时间:2023-11-30 22:52:14 24 4
gpt4 key购买 nike

我正在尝试创建一个从字符串到字符串列表的字典。所以我想我会使用 dict.get() 的默认值关键字参数,如下所示:

read_failures = {}
for filename in files:
try:
// open file
except Exception as e:
error = type(e).__name__
read_failures[error] = read_failures.get(error, []).append(filename)

所以到最后我希望 read_failures 看起来像:

{'UnicodeDecodeError':['234.txt', '237.txt', '593.txt'], 'FileNotFoundError': ['987.txt']}

我必须使用 get() 命令,因为否则我会收到 KeyError,这在技术上应该可行。如果我在解释器中逐行执行此操作,它就会起作用。但由于某种原因,在脚本中, read_failures.get(error, []) 方法默认返回 None 而不是我指定的空列表。是否有一个 Python 版本没有默认 get 返回值?

谢谢!

最佳答案

正如其他评论和答案所指出的,您的问题是 list.append 返回 None,因此您无法将回调的结果分配给词典。但是,如果列表已在字典中,则无需重新分配它,因为 append 会就地修改它。

所以问题是,如果字典中还没有新列表,如何才能向其中添加新列表呢?一个粗略的解决方法是使用单独的 if 语句:

if error not in read_failures:
read_failures[error] = []
read_failures[error].append(filename)

但这需要在字典中查找最多 3 次键,我们可以做得更好。 dict 类有一个名为 setdefault 的方法,用于检查给定键是否在字典中。如果没有,它将为该键分配一个给定的默认值。并且无论如何,都会返回字典中的值。因此,我们可以用一行完成整个事情:

read_failures.setdefault(error, []).append(filename)

另一种替代解决方案是使用 defaultdict 对象(来自标准库中的 collections 模块)而不是普通字典。 defaultdict 构造函数采用一个 factory 参数,每当请求尚不存在的键时,都会调用该参数来创建默认值。

所以另一个实现是:

from collections import defaultdict

read_failures = defaultdict(list)
for filename in files:
try:
// open file
except Exception as e:
error = type(e).__name__
read_failures[error].append(filename)

关于Python Dictionary.get() 默认返回不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38670755/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com