2017-01-25 1 views
3

내 앱에 부울 플래그가 있습니다. 데이터 세트를 통해 작업 할 때 데이터의 필드를 사용하여 사전에 입력하고 이미 do-once 연산을 수행했는지 여부를 플래그로 지정합니다. 지금은 오른쪽 키를 사용하여 False 값의 사전을 초기화하고 데이터에서 작동하는 루프의 시작 부분에서 해당 dict를 복사합니다.Python 3에서 dict을 다시 초기화하는 가장 좋은 방법

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를 재설정 할 수있는 더 나은 방법이 있나요 : 여기에 .CSV 파일 세트에 데이터베이스 레코드를 분배하는 기능의 코드 단편이다? 더 Pythonic 방법? 파이썬 다음 stdlib에서

답변

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

((편집 :이, BTW 당신이 하지이 DICT을 복사하는 것)을 do_once = do_once_defaults 지금 고정에 대한 귀하의 do_once입니다. do_once_defaults 참조. 그래서 당신은 하지이 플래그를 재설정 걸 같은 DICT 개체 에 또 다른 참조. 실제로 복사본을 만드는 가장 간단한 방법은 do_once = dict(do_once_defaults) 수 있지만 정말 것이다 위의 제안대로 세트를 사용한다고 생각합니다)

+0

(btw)에 감사드립니다. OP가 의도 한대로 코드를 표시하도록 편집하여 질문과 관련이 있습니다. – Stobber

2

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

는, 디폴트 값은 어떤 이유로 True입니다 생각했다. updated thanks :) – ShmulikA

+1

중복이 예제에서는, 중복없이 그것은 흥미 롭습니다. –

0

예, 단지 사전 이해를 구축 :.

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

첫 번째 장소에서 독점에 대한 모든 키를 강제로 생성합니다. – ShmulikA

관련 문제