简体   繁体   中英

setDefault for Nested dictionary in python

How do I use setdefault in python for nested dictionary structures. eg..

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

I would like to setdefault for these.

Assuming self.table is a dict, you could use

self.table.setdefault(field,0)

The rest are all similar. Note that if self.table already has a key field , then the value associated with that key is returned. Only if there is no key field is self.table[field] set to 0.

Edit: Perhaps this is closer to what you want:

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']

Instead of keeping track of the count, perhaps just take the length of the list:

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

It's an oldie but a goldie. I came looking for an answer and thought I'd share my learning. I wanted to summarise user actions by screen id, action taken, and the date logged. This prototype uses the Oracle XE edition, Python 3.5 (64 bit), and the pyodbc package.

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()

nb the production version pushes the summarizing back into the Oracle engine, - using the GROUP function to count the number of actions per screen per day - but the use of nested dictionaries is still (I think) a valid response to the question that may be of use to some fellow traveller yet to pass this way. Luck.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM