在 Python 3 中重新初始化字典的最佳方法

Best way to reinitialize a dict in Python 3

我的应用程序中有一个布尔标志字典。当我处理一个数据集时,我使用数据中的字段键入字典,并标记我是否已经对它们执行了一次操作。现在,我正在使用正确的键初始化 False 值的字典,然后在对数据进行操作的循环开始时复制该字典。这是将数据库记录分发到一组 .csv 文件的函数的代码片段:

do_once_defaults = dict.fromkeys([f for f in output_file_names], False)
for db in db_files:
    do_once = dict(do_once_defaults)
    for row in cur.execute(query, params):
        if not do_once[row[0]]:
            do_once[row[0]] = True
            _replace_csv_headers(output_files[row[0]], [r[0] for r in cur.description])
        _write_record_to_csv(row[1:])

有没有更好的方法在每次外部迭代时重置标志字典?更 Pythonic 的方式?

使用 python 标准库中的 defaultdict

from collections import defaultdict

d = defaultdict(bool)

print(d)
for key in ['foo', 'bar', 'foo']:
    if not d[key]:
        d[key] = True
        print('doing operation for %s' % key)
print(d)

输出:

defaultdict(<class 'bool'>, {})
doing operation for foo
doing operation for bar
defaultdict(<class 'bool'>, {'foo': True, 'bar': True})

你最好完全不要使用字典。值只是布尔值的字典实际上只是一个集合(除非您实际上区分了三个值 True/False/notIncluded,但您没有这样做)。

我想这就是你想要的:

for db in db_files:
    done = set()
    for row in cur.execute(query, params):
        if row[0] not in done:
            done.add(row[0])
            _replace_csv_headers(output_files[row[0]], [r[0] for r in cur.description])
        _write_record_to_csv(row[1:])

((编辑:这是关于 now-fixed do_once = do_once_defaults) 顺便说一句,你 不是 复制字典。你的 do_once只是对 相同 dict 对象的另一个引用 do_once_defaults 引用。所以你 不是 在那里重置标志。最简单的方法实际制作副本是 do_once = dict(do_once_defaults),但我真的认为您应该按照上面的建议使用该集合。)

是的,只是建立一个字典理解:

do_once = {t: False for t in output_file_names}