[英]Why does `int in List[List[int]]` return `False` but `np.int in List[List[int]]` return `True`?
在检查一个数字是否在列表中时,我观察到了这种奇怪的行为。 如果数字是通用 int 类型,则检查失败; 但如果数字是 numpy.int64 类型,则检查成功。 谁能解释为什么? 我知道我可以通过生成列表lst=df['A'].values.tolist()
来获得整数列表而不是列表列表来做得更好。 但我的问题是为什么 numpy.int64 会在下面工作?
import pandas as pd
import numpy as np
df = pd.DataFrame({'A': range(31, 36)})
print(df)
# A
# 0 31
# 1 32
# 2 33
# 3 34
# 4 35
lst=df.values.tolist()
print(lst)
# [[31], [32], [33], [34], [35]]
x=31
print(x) # 31
print(type(x)) # <class 'int'>
if x in lst:
print('Yes')
else:
print('No')
# prints No!
y=df['A'][0]
print(y) # 31
print(type(y)) # <class 'numpy.int64'>
if y in lst:
print('Yes')
else:
print('No')
# prints Yes
您的列表不包含31
。 它包含另一个包含31
的列表,但它不直接包含31
。
thing in lst
这样工作的:
for x in lst:
if x is thing or x == thing:
return True
return False
当您检查列表中是否有常规 int 时, x == thing
始终为False
,因为列表中的所有元素都是更多列表,并且 int 永远不会等于列表。 但是,使用 numpy.int64,比较广播。 当你比较
numpy.int64(31) == [31]
[31]
被转换为 NumPy 数组,你得到一个元素比较结果的数组,将numpy.int64(31)
与数组的每个元素进行比较,结果是
numpy.array([True])
单元素 NumPy 布尔数组在if
检查中被视为其单个元素,因此当逻辑in
的列表将numpy.int64(31)
与[31]
进行比较时,它认为这些是相等的,并报告True
作为结果检查in
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.