setDefault для вложенного словаря в Python - PullRequest
3 голосов
/ 26 июля 2010

Как использовать setdefault в python для вложенных структур словаря. например ..

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

Я бы хотел установить по умолчанию для них.

Ответы [ 2 ]

2 голосов
/ 26 июля 2010

Предполагая, что self.table является диктом, вы можете использовать

self.table.setdefault(field,0)

Все остальные похожи. Обратите внимание, что если self.table уже имеет ключ field, возвращается значение, связанное с этим ключом. Только при отсутствии ключа field устанавливается self.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 голосов
/ 25 апреля 2017

Это старичок, но голди.Я пришел в поисках ответа и решил поделиться своими знаниями.Я хотел обобщить действия пользователя по идентификатору экрана, выполненным действиям и дате регистрации.В этом прототипе используется версия 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()

nb рабочая версия отправляет суммирование обратно в механизм Oracle, используя функцию GROUP для подсчетаколичество действий на экран в день - но использование вложенных словарей по-прежнему (я думаю) является верным ответом на вопрос, который может быть полезен некоторым попутчикам, которые еще не прошли этот путь.Удача.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...