在python的计算机逻辑中,分布规律有效吗?

在python的计算机逻辑中,分布规律有效吗?,python,logical-operators,Python,Logical Operators,我认为如果条件1和条件2的结果是相同的。但事实并非如此 a= [[20200101, 'batman'], [20200102, 'superman'], [20200102, 20200102], [20200103, 20200103]] #if condition 1 for item in a: if (item[1] != 'batman') and (item[1] != item[0]): print(item) print('div') #if con

我认为如果条件1和条件2的结果是相同的。但事实并非如此

a= [[20200101, 'batman'], [20200102, 'superman'], [20200102, 20200102], [20200103, 20200103]]

#if condition 1
for item in a:
    if (item[1] != 'batman') and (item[1] != item[0]):
        print(item)
print('div')

#if condition 2
for item in a:
    if item[1] != ('batman' and item[0]):
        print(item)
结果

[20200102, 'superman']
div
[20200101, 'batman']
[20200102, 'superman']
如果条件1的结果是我所期望的。
我想我应该重新学习我自2015年以来就忘记的逻辑。

x和y
检查
x
的计算结果是否为真,如果为真,则产生
y
(或者
x
)。举以下例子:

>>> 1 and []
[]
>>> [] and 1
[]
在您的示例中,由于
“蝙蝠侠”
为真,因此始终会生成
项[0]
,因此您只需检查
项[0]!=项目[1]
。如果要缩短该支票,可以使用:

if 'batman' != item[1] != item[0]:
    ...
链式比较展开为检查左侧比较
和右侧比较。更具可读性的可能是使用
元组

if item[1] not in ('batman', item[0]):
    ...

(“蝙蝠侠”和项目[0])
将始终计算为
项目[0]
,因此您总是在测试
项目[1]!=项[0]
您使用的不是法律;充其量,这是英语中的一个成语(尽管你会说“第一项不等于蝙蝠侠或第零项”),而不是和。分布规律类似于A和(b或c)==a和b或a和c
!=
在Python和数学中都不分布在
。我不是在欺负你…只是想弄清楚你在问什么。在你的上一个代码块中,你使用了集合符号,而不是列表符号。这是故意的吗?我认为这可能会让人困惑并妨碍性能,bec因为构造一个集合要比构造一个列表复杂得多。@GregSchmit我怀疑在任何情况下性能都会受到影响,因为这里只涉及两个项目。如果确实需要使用
元组,因为列表会分配一些额外的空间;但在流行的Python实现中,这可能会被优化掉。如果您看到
检查中,为什么您会关心后面的括号类型?内部工作方式不同,但结果相同。唯一重要的是哈希性,所以我会将其更改为元组检查。元组更好。对于两个元素,哈希比只检查两者都慢。@GregSchmit,请参阅CP上的信息ython 3.7将用作比较中临时对象的列表文字优化为元组。请检查
import dis;dis.dis('1 in[0,1,2]”)
@StefanPochmann,因为使用列表/元组在复杂度上与元素数成线性关系,但构建集也具有最小线性关系(因为它必须遍历提供的元素),需要额外的工作,要么抓取预处理的哈希值,要么计算集合中每个元素的哈希值。虽然您可能会认为这是最小的,因为它有2个元素,但这显然是一个玩具示例。