2017-01-25 6 views
3

У меня есть диплом булевских флагов в моем приложении. Когда я работаю через набор данных, я вставляю в поле dict, используя поля из данных, и флаг, выполнял ли я на них операцию do-once. Прямо сейчас, я инициализирую диктовку значений False с помощью правильных клавиш, а затем копирую этот dict в начале цикла, который работает с данными. Вот фрагмент кода из функции, которая распределяет записи базы данных в набор файлов .csv:Лучший способ для повторной инициализации dict в Python 3

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:]) 

есть лучший способ сбросить Dict флагов на каждой внешней итерации? Более питоновский путь?

ответ

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:]) 

((Edit: Это примерно теперь фиксированной do_once = do_once_defaults) Кстати, вы не копирование Dict Ваш do_once есть. просто еще одна ссылка на того же объекта dict, что do_once_defaults ссылок. Итак, вы не, сбросив там флаги. Самый простой способ сделать копию - do_once = dict(do_once_defaults), но я действительно думаю, вы должны использовать набор, как было предложено выше)

+0

Спасибо за (кстати). Я отредактирую OP, чтобы показать код, который делает то, что предназначено, поэтому оно уместно для вопроса. – Stobber

2

использование defaultdict из питона STDLIB:

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}) 
+0

правильно, думал значение по умолчанию Правда по некоторым причинам. обновлено спасибо :) – ShmulikA

+1

Я бы включил дубликаты в примере, без дубликатов, это довольно неинтересно. –

0

Да, просто построить словарь понимания:.

do_once = {t: False for t in output_file_names} 
+0

это заставит создавать все ключи на дикторе на первом месте – ShmulikA