Tim*_*imY 1 python optimization list-comprehension generator
我需要构建空的嵌套字典的大树,并想知道下面的代码是否是Pythonic:
dictionary_name = dict((year, dict((month, dict((day, []) for day in days))
for month in months)) for year in years)
Run Code Online (Sandbox Code Playgroud)
注意:此问题也适用于列表推导.如果您认为我应该将此问题分解为多个问题,请告诉我.
你上面的东西对我的口味来说有点过于密集......我实际上通常会避免像那样嵌套表达,因为我很难记住它们是从内到外读取,还是在外面读取,或者通过某种奇怪的魔法随机方法.也就是说,我知道还有其他人写了很棒的python代码,有时会嵌套,我认为只要你不嵌套得太深就可以了.
就个人而言,我可能会创建一个dict使用元组来索引它的东西 - 我可能会考虑使用defaultdict:
from collections import defaultdict
dictionary_name = defaultdict(list)
dictionary_name[(year,month,day)].append(data)
#your way would be: `dictionary_name[year][month][day].append(data)`
Run Code Online (Sandbox Code Playgroud)
这是(恕我直言)比你上面的更容易理解的代码(即更pythonic).
如果你不想要defaultdict,你可以itertools.product用来构建字典:
dictionary_name = dict( ( k,[] ) for k in it.product(years,months,days) )
Run Code Online (Sandbox Code Playgroud)
要么
dictionary_name = { k:[] for k in it.product(years,months,days) } #py2.7+
Run Code Online (Sandbox Code Playgroud)
如果你不介意使用defaultdict,我会去
from collections import defaultdict
import itertools
dd = defaultdict( defaultdict )
for y, m, d in itertools.product( years, months, days ):
dd[y][m][d] = []
Run Code Online (Sandbox Code Playgroud)