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

时间:2017-01-25 20:50:07

标签: python dictionary flags

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

3 个答案:

答案 0 :(得分:4)

你最好不要使用dict。值只是布尔值的字典实际上只是一个集合(除非你实际上区分了三个值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:])

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

答案 1 :(得分:2)

使用python stdlib中的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})

答案 2 :(得分:0)

是的,只需构建字典理解:

do_once = {t: False for t in output_file_names}