多级字典python

时间:2013-12-12 13:06:47

标签: python dictionary nested defaultdict

我早上花了相同的问题/答案(What is the best way to implement nested dictionaries?Multiple levels of keys and values in PythonPython: How to update value of key value pair in nested dictionary?),但我仍然无法解决问题。

我有这个标签词典,以元组为键,我想作为值:整数,字典,另一个字典和一些列表。然后对于每个键,如下所示:(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)

1 个答案:

答案 0 :(得分:4)

我会为你的值创建一个类,它显然很复杂。

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