我早上花了相同的问题/答案(What is the best way to implement nested dictionaries?,Multiple levels of keys and values in Python,Python: 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)
答案 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] ...