python any() 的工作方式不同,为什么 any([1,2]) in [1,3,5] returns True 但不是 any(['a','b' ]) 在 ['a','v','x'] 中?
python any() works differently , why any([1,2]) in [1,3,5] returns True but not any(['a','b']) in ['a','v','x']?
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' 时隐式转换为 bool ('a' --> True) 但进行精确匹配(1 就像是内部表示True) 使用 'in'.
时
正确的 any 用法是:
>>> 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(['a','b'])
是 True
,也是 any([1,2])
。所以你真的在问 python "Is True
in the following list?"
你只是碰巧在第一个例子中很幸运,1
被 python 视为等同于 True
,所以就它而言,True
在1, 2, 3
中是
尝试... any(1, 2, 3) in (3, 4)
...错误。因为 1
不在第二个列表中。
您没有正确使用 any()
。
any()
接受一个可迭代对象,如果可迭代对象中的任何值是真值,则它 returns 真,否则它 returns 假。
因此,在您的第一个示例中:
any([1,2]) in [1,3,5]
您在简单的可迭代对象 [1,2]
上调用 any()
,并且任何非零数都是真实的,因此 any()
returns True
.
True
恰好有一个整数值1,所以你的说法等价于1 in [1,3,5]
,是真的。
您实际上想要这个:
any(x in [1,3,5] for x in [1,2])
any(x)
returns True
当且仅当 x
的任何元素计算为 True
.
因此,any([1,2]) in [1,3,5]
首先计算 any([1, 2])
,即 True
,因为 1
是 'Truthy',然后 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
?
这是因为'truthiness'和等价的区别。
any(['a', 'b'])
也是 True
。因为bool('a') == True
,'a'就是'truthy'。 然而,True != 'a'
,所以在第二部分倒下了,因为'a'
和'True'不等价 即 True
不在 ['a', 'v', 'b']
中。
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' 时隐式转换为 bool ('a' --> True) 但进行精确匹配(1 就像是内部表示True) 使用 'in'.
时正确的 any 用法是:
>>> 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(['a','b'])
是 True
,也是 any([1,2])
。所以你真的在问 python "Is True
in the following list?"
你只是碰巧在第一个例子中很幸运,1
被 python 视为等同于 True
,所以就它而言,True
在1, 2, 3
尝试... any(1, 2, 3) in (3, 4)
...错误。因为 1
不在第二个列表中。
您没有正确使用 any()
。
any()
接受一个可迭代对象,如果可迭代对象中的任何值是真值,则它 returns 真,否则它 returns 假。
因此,在您的第一个示例中:
any([1,2]) in [1,3,5]
您在简单的可迭代对象 [1,2]
上调用 any()
,并且任何非零数都是真实的,因此 any()
returns True
.
True
恰好有一个整数值1,所以你的说法等价于1 in [1,3,5]
,是真的。
您实际上想要这个:
any(x in [1,3,5] for x in [1,2])
any(x)
returns True
当且仅当 x
的任何元素计算为 True
.
因此,any([1,2]) in [1,3,5]
首先计算 any([1, 2])
,即 True
,因为 1
是 'Truthy',然后 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
?
这是因为'truthiness'和等价的区别。
any(['a', 'b'])
也是 True
。因为bool('a') == True
,'a'就是'truthy'。 然而,True != 'a'
,所以在第二部分倒下了,因为'a'
和'True'不等价 即 True
不在 ['a', 'v', 'b']
中。