将生成器嵌入发电机中是Pythonic吗?

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)
  • 如果这是不好的做法,那么编写上述代码的Pythonic方法是什么?
  • 如果这不是一个不好的做法,我应该在哪里使用换行符来保持这个清晰和"Pythonic".此外,嵌套它们时发电机的速度优势是否仍然存在?

注意:此问题也适用于列表推导.如果您认为我应该将此问题分解为多个问题,请告诉我.

mgi*_*son 5

你上面的东西对我的口味来说有点过于密集......我实际上通常会避免像那样嵌套表达,因为我很难记住它们是从内到外读取,还是在外面读取,或者通过某种奇怪的魔法随机方法.也就是说,我知道还有其他人写了很棒的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)


che*_*ner 5

如果你不介意使用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)