2010-07-26 7 views
3

중첩 된 사전 구조에 대해 python에서 setdefault를 사용하려면 어떻게해야합니까? 예 ..python에서 중첩 된 사전에 대한 setDefault

self.table[field] = 0 
self.table[date] = [] 
self.table[value] = {} 

나는이에 대한을 setDefault하고 싶습니다. self.table 가정

답변

2

당신은

self.table.setdefault(field,0) 

나머지는 모두 비슷 사용할 수하는 딕셔너리입니다. self.table에 이미 field 키가있는 경우 해당 키와 연관된 값이 반환됩니다. 키와 fieldself.table[field] 세트

0으로 편집하지있을 경우에만 :는 아마도이에 가까운 당신이 원하는 :

대신 수의 트랙을 유지
import collections 
class Foo(object): 
    def __init__(self): 
     self.CompleteAnalysis=collections.defaultdict(
      lambda: collections.defaultdict(list)) 

    def getFilledFields(self,sentence): 
     field, field_value, field_date = sentence.split('|') 
     field_value = field_value.strip('\n') 
     field_date = field_date.strip('\n') 
     self.CompleteAnalysis[field]['date'].append(field_date) 
     self.CompleteAnalysis[field]['value'].append(field_value) 

foo=Foo() 
foo.getFilledFields('A|1|2000-1-1') 
foo.getFilledFields('A|2|2000-1-2') 
print(foo.CompleteAnalysis['A']['date']) 
# ['2000-1-1', '2000-1-2'] 

print(foo.CompleteAnalysis['A']['value']) 
# ['1', '2'] 

는 아마도 단지 길이를 가지고 목록의 :

print(len(foo.CompleteAnalysis['A']['value'])) 
# 2 
+0

한 번 더 쿼리 해 주셔서 감사합니다. 어떻게 self.table [tablename] [field] [count] = 0을 설정할 수 있습니까? – Jayanth

+1

이런 식으로 작동하지만 작동하지 않습니다. : - (( 데프 getFilledFields (자기, 문장) : 카운트 = 0 날짜 = [] 값 = [] 필드 = sentence.split ('|') [0] FIELD_VALUE = sentence.split를 ('| '] [1] .strip ('\ n ') field_date = sentence.split ('| ') [2] .strip ('\ n ') try : self.CompleteAnalysis [field] [count] = self [field] [count] + 1 제외 : self.CompleteAnalysis [field] [count] = 0 self.CompleteAnalysis [필드] [날짜] .append (필드 _ 날짜) self.CompleteAnalysis [필드] [값] .append (field_value) – Jayanth

+0

샘플 문장의 모양과 자기가 원하는 것을 질문에 추가 할 수 있습니까? CompleteAnalysis는'self.getFilledFields (sentence)'를 호출 한 것처럼 보이게 할 것인가? 나는 추측을하지만 확실치 않습니다. – unutbu

0

그것은 골동품입니다. 나는 대답을 찾고 와서 내 학습을 나누겠다고 생각했습니다. 나는 화면 ID, 취한 조치 및 기록 된 날짜별로 사용자 조치를 요약하려고했습니다. 이 프로토 타입은 Oracle XE 에디션, Python 3.5 (64 비트) 및 pyodbc 패키지를 사용합니다.

import pyodbc 

spam = {} 

sqlQuery = ' \ 
    SELECT actionexecutedon, screenid, eventtype \ 
    FROM bmx_production_history \ 
' 

connection= pyodbc.connect('dsn=XE;uid=hr;pwd=hr') 

try: 
     cursor = connection.cursor() 
     cursor.execute(sqlQuery) 
     records = cursor.fetchall() 
     for record in records: 

       spam.setdefault(record.SCREENID, {}) 

       spam[record.SCREENID].setdefault(record.EVENTTYPE, {}) 

       spam[record.SCREENID][record.EVENTTYPE].setdefault(record.ACTIONEXECUTEDON.strftime('%Y-%m-%d'), 0) 
       spam[record.SCREENID][record.EVENTTYPE][record.ACTIONEXECUTEDON.strftime('%Y-%m-%d')]+=1 

     print(spam) 

finally: 
     connection.close() 

n.b. 프로덕션 버전은 요약을 다시 Oracle 엔진으로 푸시합니다. - GROUP 함수를 사용하여 하루에 화면 당 작업 수를 계산합니다. 그러나 중첩 된 사전을 사용하면 여전히 질문에 대한 유효한 응답이됩니다 (생각합니다). 이런 식으로 지나가려면 동료 여행자에게 사용하십시오. 운.

관련 문제