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

标签 python list numpy

我在检查某个数字是否在列表中时观察到了这种奇怪的行为。如果数字是泛型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/

相关文章:

python - 这是一个系列还是数据框?

python - 数组的分布图

python - 在 python 中读取 csv 文件并将每个行项目作为脚本中的值进行迭代?

python - 在随机位置分割字符串并将结果部分添加到列表中

python - Django:显示列表列表中的值

java - 列表类型之间的转换,java

python - Django:类型错误:实例(模型对象)之间不支持 '<'

python - 将 pandas 中的日期时间索引转换为单独的列

python - 删除多个元素而不更新到最后

python - 使用已弃用的 Numpy API