我的应用程序中有一个布尔标志的字典。当我处理数据集时,我使用数据中的字段键入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方式?
答案 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}