在生成器中嵌套生成器是Pythonic吗?
我需要构建大型空嵌套字典树,并想知道下面的代码是否是Pythonic代码:在生成器中嵌套生成器是Pythonic吗?,python,optimization,generator,list-comprehension,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) 如果这是一种糟糕的做法,那么编写上述代码的最具python风格的方式是什么 如果这不是一个糟糕的做法,我应该在哪里使用换行符来保持这一易读性
dictionary_name = dict((year, dict((month, dict((day, []) for day in days))
for month in months)) for year in years)
- 如果这是一种糟糕的做法,那么编写上述代码的最具python风格的方式是什么
- 如果这不是一个糟糕的做法,我应该在哪里使用换行符来保持这一易读性和“Pythonic”。此外,在嵌套发电机时,发电机的速度优势是否仍然存在
注意:这个问题也适用于列表理解。如果你认为我应该把这个问题分成多个问题,请告诉我。你上面的内容对我来说有点太多了。。。事实上,我通常避免嵌套这样的表达式,因为我很难记住它们是从内到外读取的,还是从外到内读取的,或者是通过某种奇怪的魔法随机方法读取的。也就是说,我知道有些人编写了很棒的python代码,他们有时会嵌套,我认为只要嵌套不太深就可以了
个人,我可能会创建一个<代码> DICT<代码>,它使用元组来索引它,我可以考虑使用<代码> Debug
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)`
这(IMHO)是一段比上面的代码更容易理解的代码(也就是说,更像pythonic)
如果不需要defaultdict
,可以使用itertools.product
构建dict:
dictionary_name = dict( ( k,[] ) for k in it.product(years,months,days) )
或
你上面的东西对我来说有点太浓了。。。事实上,我通常避免嵌套这样的表达式,因为我很难记住它们是从内到外读取的,还是从外到内读取的,或者是通过某种奇怪的魔法随机方法读取的。也就是说,我知道有些人编写了很棒的python代码,他们有时会嵌套,我认为只要嵌套不太深就可以了
个人,我可能会创建一个<代码> DICT<代码>,它使用元组来索引它,我可以考虑使用<代码> Debug
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)`
这(IMHO)是一段比上面的代码更容易理解的代码(也就是说,更像pythonic)
如果不需要defaultdict
,可以使用itertools.product
构建dict:
dictionary_name = dict( ( k,[] ) for k in it.product(years,months,days) )
或
列表理解的复杂性更多地是个人/开发团队风格的问题,而不是纯粹的“成为Pythonic”问题。对于这种情况,一个很好的潜在参考工具是。他们说: 可以用于简单的情况 有一个“决定”(即谷歌内部对这个问题的态度): 可以用于简单的情况。每个部分必须放在一行上:映射表达式、for子句、过滤器表达式。不允许使用多个for子句或筛选器表达式。当事情变得更复杂时,使用循环 就个人而言,我会选择嵌套的ListComp,只要它们可以立即理解,否则会分解成多个部分、函数等 您的问题的其他注释:
- 是的,您可以在listcomps中进行换行,这有时有助于提高可读性
- 对于速度,答案是“视情况而定”,对于堆栈溢出,可能更多的是一个单独的问题(我相信您会在这里找到一些好的起点)。如果没有其他问题:(1)确保这是一个瓶颈,然后(2)对备选方案进行基准测试
归根结底,风格问题是一个“运用你的判断力”的问题——只是要考虑到其他开发人员,他们以后会遇到你的代码。列表理解的复杂性更多地是个人/开发团队风格的问题,而不是纯粹的“成为Pythonic”的问题。对于这种情况,一个很好的潜在参考工具是。他们说: 可以用于简单的情况 有一个“决定”(即谷歌内部对这个问题的态度): 可以用于简单的情况。每个部分必须放在一行上:映射表达式、for子句、过滤器表达式。不允许使用多个for子句或筛选器表达式。当事情变得更复杂时,使用循环 就个人而言,我会选择嵌套的ListComp,只要它们可以立即理解,否则会分解成多个部分、函数等 您的问题的其他注释:
- 是的,您可以在listcomps中进行换行,这有时有助于提高可读性
- 对于速度,答案是“视情况而定”,对于堆栈溢出,可能更多的是一个单独的问题(我相信您会在这里找到一些好的起点)。如果没有其他问题:(1)确保这是一个瓶颈,然后(2)对备选方案进行基准测试
归根结底,风格问题是一个“使用您的判断”的问题——只需考虑到其他开发人员,他们以后会遇到您的代码。如果您不介意使用
defaultdict
,我会同意
from collections import defaultdict
import itertools
dd = defaultdict( defaultdict )
for y, m, d in itertools.product( years, months, days ):
dd[y][m][d] = []
如果您不介意使用
defaultdict
,我会选择
from collections import defaultdict
import itertools
dd = defaultdict( defaultdict )
for y, m, d in itertools.product( years, months, days ):
dd[y][m][d] = []
虽然我同意其他海报上的说法,这个表达有点密集,用另一种方式把它分解可能是个好主意,但如果你要写这么密集的东西,稍微调整一下缩进可以大大提高可读性:
dictionary_name = dict(
(year, dict((month, dict((day, [])
for day in days))
for month in months))
for year in years)
虽然我同意其他海报上的说法,这个表达有点密集,用另一种方式把它分解可能是个好主意,但如果你要写这么密集的东西,稍微调整一下缩进可以大大提高可读性:
dictionary_name = dict(
(year, dict((month, dict((day, [])
for day in days))
for month in months))
for year in years)
如果它更具可读性,它就是“蟒蛇式的”。是的,非常好。你认为什么是pythonic的替代方案?我是否应该将问题重命名为“到[…]是否有效?”这取决于你想问什么。你有没有理由不创建一个以
(年、月、日)
元组作为键的字典?如果它更具可读性,它就是“pythonic”。是的,非常有理由。你认为什么是pythonic的替代方案?我是否应该将问题重命名为“它对[…]有效吗?”这取决于你想问什么。你不想创建1个di有什么原因吗