Python中list的比較

2022-08-14 14:30:18 字數 1926 閱讀 2217

在python中,執行如下的**

nan = float("

nan"

)print nan ==nan

print [nan] == [nan]

其輸出結果分別為false 和 true,於是決定去檢視相關的**查詢原因。

首先,float中nan在ieee標準中有約定,與任何值都不相等,所以主要需要確認的就是列表的比較規則。

static pyobject *list_richcompare(pyobject *v, pyobject *w, int op)

list的比較使用的是list_richcompare函式,接收3個引數,待比較的兩個引用以及操作符

if (!pylist_check(v) || !pylist_check(w)) 

vl = (pylistobject *)v;

wl = (pylistobject *)w;

首先檢查輸入的待比較的元素是否是列表,然後轉換指標的型別為列表

if (py_size(vl) != py_size(wl) && (op == py_eq || op ==py_ne))

對於,==和!=兩個操作符,如果兩個列表的大小不想等,則可以直接返回false或者true的結果,無須再進行其他比較。

for (i = 0; i < py_size(vl) && i < py_size(wl); i++)

從頭開始比較列表的中元素,直到有乙個列表遍歷完或者有不相等的情況則中止,搜尋出第乙個不相等的成員的索引值。

其中對於每個元素的比較,呼叫的是pyobject_richcomparebool方法

if (i >= py_size(vl) || i >=py_size(wl)) 

if(cmp)

res =py_true;

else

res =py_false;

py_incref(res);

return

res;

}

如果至少有乙個列表遍歷結束,則所有比較過的元素都一致。

則哪個列表的尺寸長,那麼該列表就大。如果兩個列表的尺寸相同,則這兩個列表就相等。只需針對不同的op,返回不同的結果即可。

if (op ==py_eq) 

if (op ==py_ne)

如果在兩列表的尺寸範圍內,找到了不相等的成員,就說明這兩個列表不相等,為==和!=提供捷徑。

return pyobject_richcompare(vl->ob_item[i], wl->ob_item[i], op);

當op不為py_eq或py_ne時,就將第乙個不相等的成員的比較結果作為,這兩個列表的比較結果。

對於pyobject_richcomparebool

/*

return -1 if error; 1 if v op w; 0 if not (v op w).

*/int

pyobject_richcomparebool(pyobject *v, pyobject *w, int

op) res =pyobject_richcompare(v, w, op);

if (res ==null)

return -1

;

if(pybool_check(res))

ok = (res ==py_true);

else

ok =pyobject_istrue(res);

py_decref(res);

return

ok;}

在比較之前,會首先看兩個比較元素的引用位址,如果相同則視為相等。

所以nan在列表中比較時由於引用位址一樣,也會被視為相等。

list中的比較

一說到list的的確不知道寫些什麼。我覺得別人總結的比我寫的還要好很多。list 元素是有序的 怎麼存的就怎麼取出來,順序不會亂 元素可以重複 角標1上有個3,角標2上也可以有個3 因為該集合體系有索引,arraylist 底層的資料結構使用的是陣列結構 陣列長度是可變的百分之五十延長 特點是查詢很...

java中List集合的比較

list集合 list是乙個介面,它的父類介面時collection list的實現類 arraylist 陣列實現 linkedlist 鍊錶實現 vector 也是陣列實現 arraylist 和 linkedlist 1 實現不同,乙個是陣列實現,乙個是鍊錶實現 2 效率不同,arraylis...

python中改變list中list值的問題

l s 0,0,0 for i in range 3 l 1 1 1 print l 如上 定義乙個空list,新增元素也為list型別。本意是想改變list l中乙個值,使其結果為 0,0,0 0,1,0 0,0,0 但執行的結構下圖所示,將list l中的所有元素都改變了。為找到原因,檢視pyt...