Многоуровневый словарь python

Я провел утро, читая похожие вопросы/ответы (Как лучше всего реализовать вложенные словари?, Несколько уровни ключей и значений в Python, Python: Как обновить значение пары ключ-значение во вложенном словаре?), но я все еще не могу решить проблему.

У меня есть этот словарь вкладок с кортежем в качестве ключа, и я хочу в качестве значений: целое число, словарь, другой словарь и некоторые списки. Затем для каждого ключа что-то вроде этого: (str,str,str,str):{int, {}, {}, [], [] ...}

Я хочу иметь возможность обновлять эти структуры значений, и мне нужен defaultdict, потому что я не знаю всех ключей, и в любом случае их слишком много, чтобы объявлять их один за другим вручную.

Я могу сделать это для такой структуры (str,str,str,str):{int} следующим образом:

tab=defaultdict(lambda: defaultdict(int))

tab[key][0]+=1

Или для такой структуры (str,str,str,str):{{}, {}} таким образом:

tab=defaultdict(lambda: defaultdict(lambda: defaultdict(int)))

tab[key][1][str]+=1

tab[key][2][str]+=1

Но не для того, что мне действительно нужно. Спасибо!

Хорошо, спасибо @RemcoGerlich, я пытаюсь решить проблему, но я никогда раньше не использовал класс, и, возможно, в моем коде все еще что-то не так... Кстати, int - это счетчик, два словаря имеют IP-адреса, такие как ключи и количество вхождений в качестве значений.

class flux(object):
    def __init__(self, count_flux=0, ip_c_dict=None, ip_s_dict=None):
        self.count_flux = count_flux
        self.ip_c_dict = ip_c_dict if ip_c_dict is not None else {}
        self.ip_s_dict = ip_s_dict if ip_s_dict is not None else {}

def log_to_dict(dir_file,dictionary):
    f = gzip.open(dir_file,'r')
    for line in f:
        line = line.strip('\n')
        if not line: break
        elements = line.split(" ")
        key=elements[40],elements[18],elements[41],elements[37]
        dictionary[key].count_flux+=1
        dictionary[key].ip_c_dict[elements[0]]+=1
        dictionary[key].ip_s_dict[elements[19]]+=1

###Main
tab=defaultdict(flux)

log_to_dict('/home/-/-.txt',tab)

person user2961420    schedule 12.12.2013    source источник
comment
Я не вижу здесь многоуровневого словаря... :(   -  person thefourtheye    schedule 12.12.2013
comment
Измените его так, чтобы они инициализировались как defaultdict(int) вместо {} в init (редактировать: int вместо 0...)   -  person RemcoGerlich    schedule 12.12.2013


Ответы (1)


Я бы создал класс для ваших значений, это явно сложно.

class YourClass(object):
    def __init__(self, anint=0, adict=None, anotherdict=None, somelists=None):
        self.anint = anint
        self.adict = adict if adict is not None else {}
        self.anotherdict = anotherdict if anotherdict is not None else {}
        self.somelists = somelists if somelists is not None else []

(не используйте {} или [] в качестве аргументов по умолчанию, это приведет к их совместному использованию всеми экземплярами).

Затем вы можете использовать defaultdict(YourClass), а также установить такие вещи, как tab[key].anotherdict[str]...

person RemcoGerlich    schedule 12.12.2013
comment
Спасибо за вашу помощь! Но у меня все еще есть некоторые проблемы, я не смог ответить здесь, я отредактировал вопрос. - person user2961420; 12.12.2013