any([1,2]) in [1,3,5]
输出True
这是正确的,但是
any(['a','b']) in ['a','v','x']
给False
哪个是错误的??
为什么在 Python 中会有这种行为。??
它们实际上是两个操作:
首先评估"any",然后检查结果是否在另一个列表中:
any(list) --> is there any item in the list that is equivalent to True?
any([1, 2]) --> True, any non-zero integer is equivalent to True!
any(['a', 'b']) --> True, any character is equivalent to True!
然后
is the result (True) in [1, 3, 5]? --> Yes! 1 and True are actually the same!
is the result (True) in ['a','v','x']? --> No! True (or 1) is not in the list
您可以使用"set"来解决问题:
set([1, 2]) & set([1, 3, 5]) --> set([1]) --> True, any non-empty set is equivalent to True!
set(['a','b']) & set(['a','v','x']) --> set(['a']) --> True, any non-empty set is equivalent to True!
与注释中一样,Python 在使用"any"时隐式转换为布尔值('a' --> True(,但在使用"in"时会完全匹配(1 就像 True 的内部表示(。
any(x)
返回True
当且仅当x
的任何元素计算结果为True
。
所以,any([1,2]) in [1,3,5]
首先评估any([1, 2])
哪个是True
,因为1
是"真实的",然后做True in [1, 3, 5]
。
True in [1, 3, 5]
之所以True
in
是因为测试项目与in
之前的任何内容的相等性。因为,在Python中,True == 1
,True
确实在[1, 2, 3]
因此any([1,2]) in [1,3,5]
True
!
那么为什么第二个False
呢?
这是因为"真实性"和等效性之间的区别。
any(['a', 'b'])
也是True
.自bool('a') == True
年以来,"a"是"真实的"。但是,True != 'a'
,所以它在第二部分就掉下来了,因为'a'
和"真"并不等同,也就是说,True
不在['a', 'v', 'b']
中。
正确的任何用法是:
>>> any(x in ['a','v','x'] for x in ['a', 'b'])
True
>>> any(x in ['a','v','x'] for x in ['ea', 'b'])
False
您需要逐个检查。
您没有正确使用any()
。
any()
采用可迭代对象,如果可迭代对象中的任何值为 true,则返回 True,否则返回 False。
因此,在您的第一个示例中:
any([1,2]) in [1,3,5]
你在简单的可迭代[1,2]
上调用any()
,任何非零数都是真数,所以any()
返回True
。
True
恰好有一个整数值 1,所以你的语句等效于1 in [1,3,5]
,这是真的。
你实际上想要这个:
any(x in [1,3,5] for x in [1,2])
这正在分两部分进行评估...
any(['a','b'])
是True
,any([1,2])
也是。所以你真的在问 python"True
在下面的列表中吗?
你只是碰巧在第一个例子中很幸运,1
被python视为等同于True
,所以就它而言,True
是1, 2, 3
尝试。。。any(1, 2, 3) in (3, 4)
......假。因为1
不在第二个列表中。