Python 代码中的语法无效,我认为应该没有错误

Python 代码中的语法无效,我认为应该没有错误,python,Python,我是python世界的新手,我发现当我运行我的文件时,程序会显示 SyntaxError:无效语法 在上面的代码中,但正如我所知,这段代码应该没有语法错误,所以我想问为什么,这段代码哪里出了问题?我试图找出我错在哪里,但仍然不知道这一点。我使用Anaconda3-4.2.0-Windows-x8664此版本定义a和b后,您可以这样做: correct = [1 if ((a == 1 and b == 1) or (a == 0 and b == 0)) else 0 for (a, b)]


我是python世界的新手,我发现当我运行我的文件时,程序会显示

SyntaxError:无效语法


在上面的代码中,
但正如我所知,这段代码应该没有语法错误,所以我想问为什么,这段代码哪里出了问题?我试图找出我错在哪里,但仍然不知道这一点。
我使用Anaconda3-4.2.0-Windows-x8664此版本

定义a和b后,您可以这样做:

correct = [1 if ((a == 1 and b == 1) or (a == 0 and b == 0)) else 0 for (a, b)]
if (a==1 and b==1) or (a==0 and b==0):
    correct=1
else:
    correct=0
或者是三元格式,类似这样:

correct = [1 if ((a == 1 and b == 1) or (a == 0 and b == 0)) else 0 for (a, b)]
if (a==1 and b==1) or (a==0 and b==0):
    correct=1
else:
    correct=0

如果您想在(a=1和b=1)或(a=0和b=0)时使correct=1,并在其余可能性时使correct=0,这是对列表理解的严重误用

test1 = (a == 1) and (b == 1)
test2 = (a == 0) and (b == 0)

correct = 1 if (test1 or test2) else 0
您可能希望实现的逻辑可以通过三元语句实现:

correct=1 if ((a==1 and b==1) or (a==0 and b==0)) else 0
然而,即使这样,也几乎无法阅读。三元语句没有本质上的错误;所以我建议你把逻辑分开:

a, b = 1, 1
correct = 1 if ((a == 1 and b == 1) or (a == 0 and b == 0)) else 0
#1

我可能错了,但您在语句中缺少了一个
,或者在列表理解中说了“迭代”

test1 = (a == 1) and (b == 1)
test2 = (a == 0) and (b == 0)

correct = 1 if (test1 or test2) else 0

您所做的本质上是“非异或”,因此,您的整个逻辑可以替换为int(非(a^b))

如果您不喜欢“神奇的”“非异或”,您可以根据
(0,0)
(1,1)
显式验证输入:


这将仅替换
if
条件。如果您确实有一个元组列表,那么您仍然需要中的
,正如其他答案所示:

print(1 if (a, b) in ((0, 0), (1, 1)) else 0)
或者使用
map
,但是需要更改
validate
以接受元组(如果使用Python 3,则需要调用
list
,并且想要的输出应该是列表):


如果您只需要评估
a
b
,并且您想要一行,那么您可以使用

def validate(tup):
    return int(not tup[0] ^ tup[1])

li = [(0, 0), (0, 1), (1, 0), (1, 1)]
print(list(map(validate, li)))
# [1, 0, 0, 1]
如果
a
b
表示元组列表中的两个值,并且您想要一个由1和0组成的列表,则可以使用列表理解:

correct = 1 if ((a == 1 and b == 1) or (a == 0 and b == 0)) else 0
这个

确实是不正确的-它应该是

您真正想要做的是什么还不清楚,但是如果您有两个变量
a
b
,并且想要检查这两个变量是否都等于
0
,或者两者都等于
1
,您根本不需要理解列表:

[whatever_expression for (a, b) in some_iterable]
由于在Python中,
Bool
int
的子类,具有
False==0
True==1
,因此可以简化为

correct = 1 if (a == 0 and b == 0) or (a == 1 and b == 1) else 0
只有当您实际拥有一个对列表并希望测试所有这些对时,使用列表理解才有意义,即:

correct = (a == 0 and b == 0) or (a == 1 and b == 1)
这将产生

pairs = [(0, 0), (0, 1), (1, 0), (1, 1)]
corrects = [(a == 0 and b == 0) or (a == 1 and b == 1) for (a, b) in pairs]

什么是a和b,请显示代码的其余部分。语法肯定是无效的。您缺少迭代器。如果您是python新手,为什么要使用一个行程序?首先以简单的方式执行,并且for循环尚未完成。首先尝试以简单的方式执行,而不是使用一个行程序。您可能有一个2元组的列表(例如,
my_list
);对于我的列表中的a、b,您需要
。或者,您已经定义了
a
b
;那么您就不需要为
部分使用
。您到底想要实现什么?
correct = (a == 0 and b == 0) or (a == 1 and b == 1)
pairs = [(0, 0), (0, 1), (1, 0), (1, 1)]
corrects = [(a == 0 and b == 0) or (a == 1 and b == 1) for (a, b) in pairs]
[True, False, False, True]