Skip to main content
 首页 » 编程设计

python之在生成器中嵌套生成器是 Pythonic 吗

2025年05月04日10itcoder

我需要构建空嵌套字典的大树,并且想知道下面的代码是否是 Pythonic 的:

dictionary_name = dict((year, dict((month, dict((day, []) for day in days)) 
                       for month in months)) for year in years) 
  • 如果这是不好的做法,那么编写上述代码的最 Pythonic 方式是什么?
  • 如果这不是坏习惯,我应该在哪里使用换行符来保持它的易读性和“Pythonic”。另外,嵌套时生成器的速度优势是否仍然存在?

注释:这个问题也适用于列表理解。如果您认为我应该将这个问题分成多个问题,请告诉我。

请您参考如下方法:

你上面的内容对我来说有点太密集了……实际上我通常会避免这样的嵌套表达式,因为我很难记住它们是从内到外,还是从外到内,还是通过某种方式被阅读奇怪的魔法随机方法。也就是说,我知道有些人写的 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)` 

这是(恕我直言)比您上面的代码更容易理解的一段代码(即更多 pythonic)。

如果你不想要一个defaultdict,你可以使用itertools.product来构建dict:

dictionary_name = dict( ( k,[] ) for k in it.product(years,months,days) ) 

或

dictionary_name = { k:[] for k in it.product(years,months,days) }  #py2.7+