여기에 주니어 파이썬 프로그래머가 있습니다. 예기치 않은 루프 및 사전 동작에서 벽돌 벽에 머리를 때리고 있습니다. 내가 로그 항목의 CSV 파일을 통해 루핑하고 카테고리 dict에 데이터를 구문 분석하고있어. 나는 범주는 루프를 통해 각 시간을 DICT 초기화하면 예상대로 작동합니다 .. 그래서 같이dict 변수 & for for loop with Python
:
이보기에서log_entries = AutoVivification()
# http://stackoverflow.com/questions/635483/what-is-the-best-way-to-implement-nested-dictionaries-in-python
def scrublooper(log_file):
for ll in log_file:
# Initialize categories dict every round through the loop
categories = {'requests': {'Content_Visual': 0, 'Content_ProgramsUpdates': 0, 'Content_Text': 0, 'Pages': 0, 'Content_Files': 0}, 'filter_action': {'re': 0, 'pl': 0, 'bs': 0}}
lld = LogDomain(ll)
domain, hostname, lan_host = lld.domain, lld.hostname, lld.lan_host
mimetypes = url_searcher(Settings.mimetypes, lld.mime_type)
if mimetypes:
category = mimetypes[2]
if not log_entries[lan_host].has_key(domain):
log_entries[lan_host][domain]= categories
log_entries[lan_host][domain]['requests'][category] += 1
print log_entries['192.168.5.210']['google.com']['requests']
print log_entries['192.168.5.210']['webtrendslive.com']['requests']
print log_entries['192.168.5.210']['osnews.com']['requests']
print log_entries['192.168.5.210']['question-defense.com']['requests']
print log_entries['192.168.5.210']['optimost.com']['requests']
출력 내가 기대하는 것입니다 그러나
{'Content_Visual': 0, 'Content_ProgramsUpdates': 0, 'Content_Text': 95, 'Pages': 0, 'Content_Files': 0}
{'Content_Visual': 0, 'Content_ProgramsUpdates': 0, 'Content_Text': 1, 'Pages': 0, 'Content_Files': 0}
{'Content_Visual': 0, 'Content_ProgramsUpdates': 0, 'Content_Text': 2, 'Pages': 0, 'Content_Files': 0}
{'Content_Visual': 0, 'Content_ProgramsUpdates': 0, 'Content_Text': 18, 'Pages': 0, 'Content_Files': 0}
{'Content_Visual': 0, 'Content_ProgramsUpdates': 0, 'Content_Text': 3, 'Pages': 0, 'Content_Files': 0}
! 여기 내 문제가있다. 루프를 통해 매순간 범주를 초기화하지 않으려합니다. 이 단순화 된 예제에서는 중요하지 않지만이 프로그램의 길 아래에서 성능이 크게 저하됩니다 (30 %). I 초기화시 카테고리가 루프합니다 (scrublooper 함수인지 단순히 오른쪽 변수 log_entries 후) 출력 외부를 딕셔너리,
log_entries = AutoVivification()
categories = {'requests': {'Content_Visual': 0, 'Content_ProgramsUpdates': 0, 'Content_Text': 0, 'Pages': 0, 'Content_Files': 0}, 'filter_action': {'re': 0, 'pl': 0, 'bs': 0}}
def scrublooper(log_file):
for ll in log_file:
lld = LogDomain(ll)
# etc, etc, etc
을 그러나 :
난 딕셔너리 ONCE 범주를 초기화해야 is :
{'Content_Visual': 0, 'Content_ProgramsUpdates': 0, 'Content_Text': 685, 'Pages': 0, 'Content_Files': 0}
{'Content_Visual': 0, 'Content_ProgramsUpdates': 0, 'Content_Text': 685, 'Pages': 0, 'Content_Files': 0}
{'Content_Visual': 0, 'Content_ProgramsUpdates': 0, 'Content_Text': 685, 'Pages': 0, 'Content_Files': 0}
{'Content_Visual': 0, 'Content_ProgramsUpdates': 0, 'Content_Text': 685, 'Pages': 0, 'Content_Files': 0}
{'Content_Visual': 0, 'Content_ProgramsUpdates': 0, 'Content_Text': 685, 'Pages': 0, 'Content_Files': 0}
모든 'Conent_Text'값이 동일하게 증가했습니다. 여기서 무슨 일이 일어나고있는거야? 나는 파이썬 원칙을 어겨 봤지만 무엇을 어떻게 찾을 지 모른다. 문제가 범주 dict에 연결되어 있다는 것을 알아내는 데는 시간이 걸렸습니다.
설명이 필요합니다.
그렇다면'categories'는 실제로 어디에서 조작되고 있습니까? 나는 단지 그것이 초기화되고 읽혀지는 것을 본다. 네가 이것을 너무 단순화 시켰 니? –
너무 단순화 된 것 같지 않습니다. 항상 배정되고 절대로 조작되지 않습니다. 'log_entries' dict 키/값에 할당 :'log_entries [lan_host] .has_key (domain) :''log_entries [lan_host] [domain] = categories' – Thinkwell