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