繁体   English   中英

为什么 `int in List[List[int]]` 返回 `False` 而 `np.int in List[List[int]]` 返回 `True`?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM