簡體   English   中英

將循環更改為Python列表理解

[英]Change Loop to Python List Comprehension

有一個對象列表,“游戲”。 如何檢查對象是否具有屬性集,如果沒有,請使用list comprehensions設置屬性....

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

它可能有點快......但很奇怪:)

編輯:

我同意這兩條評論,但根據“if”條件,這可能並不完全是浪費,這里有一個例子:

  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

我想這取決於條件和循環的大小,這可能確實是浪費,但有時它可能有助於解決列表理解,即使在這種情況下。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM