2017-10-08 102 views
1

我試圖添加到基於測試不同的變量,在我的for循環:在遞增通過三元運營商不同的變量循環

for i in range(alist.__len__()): 
     if alist[i] is not blist[i]: 
      ascore +=1 if alist[i] > blist[i] else bscore+=1 
    print(ascore,bscore) 

此代碼不能正常工作。我所知道的是,if條件不適用於整個賦值(如果條件是增加ascore),它反而適用於我的值1(如果條件爲1,則增加ascore)。我更喜歡類似於第一個的功能。我可以在這裏做什麼?我明白,如果elsif可以很容易地解決這個問題,但我更關心三元運算符(一行條件)在python中的工作方式。謝謝!

+1

Python中的賦值不是表達式(不像C/C++),所以你不能在這裏使用三元運算符(它只能用於表達式)。 –

回答

2

不幸的是,你不能使用三元運算符。顧名思義,這是一個運營商,所以左側和右側都必須是表達式。然而,與許多其他語言不同,Python assignments are statements,因此它們不能用於表達式的地方。

的解決方案,爲你正確地指出,就是用一個正常的條件語句:如果你需要增加只有兩個變量

for i in range(len(list)): 
     if alist[i] is not blist[i]: 
      if alist[i] > blist[i]: 
       ascore +=1 
      else: 
       bscore +=1 
    print(ascore, bscore) 
0

- 你可以通過字典做到這一點,用下面的代碼:

scores = { 
    True: 0, # ascore 
    False: 0 # bscore 
} 

for i in range(len(alist)): 
    if alist[i] is not blist[i]: 
     scores[alist[i] > blist[i]] += 1 

print(scores) 

或者相同,但更加清晰:

scores = { 
    'ascore': 0, 
    'bscore': 0 
} 

for i in range(len(alist)): 
    if alist[i] is not blist[i]: 
     scores['ascore' if alist[i] > blist[i] else 'bscore'] += 1 

print(scores) 
0

,你也應該確保你使用=和正常的if語句

for i in range(len(alist)): 
    if alist[i]!=blist[i]: 
     if alist[i]>blist[i]: 
      ascore+=1 
     else: 
      bscore+=1 
    print(ascore,bscore) 
+0

如果兩個變量指向同一個對象,那麼'is'將返回True,如果變量所指向的對象相同,則返回'=='。此操作員有不同的用途 –

0

如果你不使用增強assignmeng堅持,你可以像這樣做:

ascore, bscore = (ascore + 1, bscore) if alist[i] > blist[i] else (ascore, bscore + 1) 

感謝ShadowRanger指點我的錯誤(我錯過了括號)。

+0

您的操作員優先順序錯誤。你只是試圖給兩個元素分配一個三元組;保證'ValueError'。你想要:'ascore,bscore =(ascore + 1,bscore)if alist [i]> blist [i] else(ascore,bscore + 1)',但你有效地寫道:'ascore,bscore = ascore + 1 bscore if alist [i]> blist [i] else ascore),bscore + 1' – ShadowRanger