簡體   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