我在检查某个数字是否在列表中时观察到了这种奇怪的行为。如果数字是泛型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
。
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 bool 数组在 if
检查中被视为其单个元素,因此当列表的 in
逻辑比较 numpy.int64(31 )
与 [31]
相比,它认为它们是相等的,并报告 True
作为 in
检查的结果。
关于python - 为什么 `int in List[List[int]]` 返回 `False` 但 `np.int in List[List[int]]` 返回 `True` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72625828/