将循环更改为Python列表理解

将循环更改为Python列表理解,python,loops,list-comprehension,Python,Loops,List Comprehension,有一个对象列表,“游戏”。我如何检查对象是否有属性集,如果没有,如何设置属性。。。。使用列表理解 for g in games: if not g.score_ratio_h1: g.score_ratio_h1 = avg_score_ratio_h1 事实上,这不是使用列表理解的好例子:。循环不会导致创建新的值列表,它只是一系列赋值。最好还是坚持使用循环,这样就好了。仅当代码如下所示时: ans = [] for g in games: if not g.score

有一个对象列表,“游戏”。我如何检查对象是否有属性集,如果没有,如何设置属性。。。。使用列表理解

for g in games:
        if not g.score_ratio_h1: g.score_ratio_h1 = avg_score_ratio_h1
事实上,这不是使用列表理解的好例子:。循环不会导致创建新的值列表,它只是一系列赋值。最好还是坚持使用循环,这样就好了。仅当代码如下所示时:

ans = []
for g in games:
    if not g.score_ratio_h1:
        ans.append(g.score_ratio_h1) # we're appending the results
。。。那么使用理解法是个好主意。但目前循环的核心是分配:

g.score_ratio_h1 = avg_score_ratio_h1
没有有用的值返回,这是一个修改操作(“副作用”),不会在任何地方收集。在这种情况下不应使用理解。更重要的是:试图在理解中完成作业会导致错误,例如:

lst = [[0], [0], [0]]
[a[0] = 1 for a in lst]
      ^
SyntaxError: invalid syntax
事实上,这不是使用列表理解的好例子:。循环不会导致创建新的值列表,它只是一系列赋值。最好还是坚持使用循环,这样就好了。仅当代码如下所示时:

ans = []
for g in games:
    if not g.score_ratio_h1:
        ans.append(g.score_ratio_h1) # we're appending the results
。。。那么使用理解法是个好主意。但目前循环的核心是分配:

g.score_ratio_h1 = avg_score_ratio_h1
没有有用的值返回,这是一个修改操作(“副作用”),不会在任何地方收集。在这种情况下不应使用理解。更重要的是:试图在理解中完成作业会导致错误,例如:

lst = [[0], [0], [0]]
[a[0] = 1 for a in lst]
      ^
SyntaxError: invalid syntax

您可以使用列表理解来执行类似操作:

for g in (g for g in games if not g.score_ratio_h1):
    g.score_ratio_h1 = avg_score_ratio_h1
也许会快一点。。。但奇怪的是:)

编辑:

我同意这两个意见,但根据“如果”条件,这可能不是完全浪费,以下是一个例子:

  lst = [0 for _ in xrange(708)]
  for i in xrange(100000000):
      if i**2 < 500000:
          lst[i] += i
与:

lst = [0 for _ in xrange(708)]
for i in (i for i in xrange(100000000) if i**2 < 500000):
    lst[i] += i

我猜,根据条件和循环的大小,这可能确实是浪费,但有时它可能有助于绕过列表理解,即使在这种情况下。

您也可以使用列表理解来执行类似操作:

for g in (g for g in games if not g.score_ratio_h1):
    g.score_ratio_h1 = avg_score_ratio_h1
也许会快一点。。。但奇怪的是:)

编辑:

我同意这两个意见,但根据“如果”条件,这可能不是完全浪费,以下是一个例子:

  lst = [0 for _ in xrange(708)]
  for i in xrange(100000000):
      if i**2 < 500000:
          lst[i] += i
与:

lst = [0 for _ in xrange(708)]
for i in (i for i in xrange(100000000) if i**2 < 500000):
    lst[i] += i

我想,根据条件和循环的大小,这可能确实是浪费,但有时它可能有助于绕过列表理解,即使在这种情况下。

在我看来,对于列表理解来说,这不是一个很好的用例。在不修改原始元素的功能样式过滤和投影时,列表理解最适合。这里,您正在对每个游戏进行变异。如果您在循环中的某个地方没有看到
append()
,那么作为列表理解可能不可行。下面的链接是关于为什么应该避免列表理解的副作用,我认为这对于列表理解来说不是一个很好的用例。在不修改原始元素的功能样式过滤和投影时,列表理解最适合。在这里,您正在对每个游戏进行变异。如果您在循环中的某个地方没有看到
append()
,那么作为列表理解可能不可行。下面的链接是关于为什么应该避免列表理解的副作用,这将创建一个新列表,在迭代结束后立即丢弃。这是浪费,我不认为使用理解是一个好主意,只是为了见鬼,当一个“传统的”循环就足够了。循环总是很昂贵,在上面的解决方案中有两个for循环,但所讨论的代码有一个循环。如果你在这里放一个生成器表达式而不是列表理解,这很好:
对于g in(如果不是g.score\u ratio\u h1,游戏中g代表g):
只需将
[]
替换为
()
.aps!我现在更了解其他评论了。谢谢@glglgl:)这将创建一个新列表,在迭代结束后立即丢弃。这是浪费,我不认为使用理解是一个好主意,只是为了见鬼,当一个“传统的”循环就足够了。循环总是很昂贵,在上面的解决方案中有两个for循环,但所讨论的代码有一个循环。如果你在这里放一个生成器表达式而不是列表理解,这很好:
对于g in(如果不是g.score\u ratio\u h1,游戏中g代表g):
只需将
[]
替换为
()
.aps!我现在更了解其他评论了。谢谢@glglgl:)