Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在生成器中嵌套生成器是Pythonic吗?_Python_Optimization_Generator_List Comprehension - Fatal编程技术网

在生成器中嵌套生成器是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风格的方式是什么 如果这不是一个糟糕的做法,我应该在哪里使用换行符来保持这一易读性

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

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有什么原因吗