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