有一个对象列表,“游戏”。如何检查对象是否具有属性集,如果没有,设置属性.... 使用列表推导?
for g in games:
if not g.score_ratio_h1: g.score_ratio_h1 = avg_score_ratio_h1
有一个对象列表,“游戏”。如何检查对象是否具有属性集,如果没有,设置属性.... 使用列表推导?
for g in games:
if not g.score_ratio_h1: g.score_ratio_h1 = avg_score_ratio_h1
事实上,这不是使用列表推导的好案例:它非常反 Pythonic。循环不会导致创建新的值列表,它只是一系列赋值。最好坚持使用循环,这很好。仅当您的代码如下所示:
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
时间:
real 0m12.906s
user 0m12.876s
sys 0m0.008s
相对:
lst = [0 for _ in xrange(708)]
for i in (i for i in xrange(100000000) if i**2 < 500000):
lst[i] += i
时间:
real 0m8.857s
user 0m8.792s
sys 0m0.016s
我猜这取决于条件和循环的大小,这可能确实是浪费,但有时它可能有助于解决列表理解,即使在这种情况下也是如此。