python - 在生成器中嵌套生成器是 Pythonic 吗?

标签 python optimization generator list-comprehension

我需要构建空嵌套字典的大树,并且想知道下面的代码是否是 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+

关于python - 在生成器中嵌套生成器是 Pythonic 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12974877/

相关文章:

python - 在将包上传到 pypicloud 之前更新 setup.py 中的版本

python - 将变量的输出显示到多于 2 位小数

algorithm - 图中的路线问题 : minimize average edge cost instead of total cost

c++ - c/c++ 编译器是否通过二次幂值将常量除法优化为移位?

algorithm - 需要一个算法来生成序列号

python - 如何实现装饰生成器

python - 从单独的文件导入类

python - Flask 配置文件不起作用

c++ - 您通常如何设置编译器的优化设置?

loops - 如何在 lisp 中生成一个笛卡尔积?