在递增通过三元运营商不同的变量循环

问题描述:

我试图添加到基于测试不同的变量,在我的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++),所以你不能在这里使用三元运算符(它只能用于表达式)。 –

不幸的是,你不能使用三元运算符。顾名思义,这是一个运营商,所以左侧和右侧都必须是表达式。然而,与许多其他语言不同,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) 

- 你可以通过字典做到这一点,用下面的代码:

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) 

,你也应该确保你使用=和正常的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,如果变量所指向的对象相同,则返回'=='。此操作员有不同的用途 –

如果你不使用增强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