在 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}
我的应用程序中有一个布尔标志字典。当我处理一个数据集时,我使用数据中的字段键入字典,并标记我是否已经对它们执行了一次操作。现在,我正在使用正确的键初始化 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}