這是代碼:
def is_subsequence(a, b):
b = iter(b)
gen = ((i in b) for i in a)
print(gen)
for i in gen:
print(i)
return all(((i in b) for i in a))
res1 = is_subsequence([1, 3, 5], [1, 2, 3, 4, 5])
res2 = is_subsequence([1, 4, 3], [1, 2, 3, 4, 5])
結果是res1==False和res2==False。顯然結果res1是不正確的。當我注釋掉 for 回圈 print, res1==Trueand 時res2==False,這是正確的。我糊涂了。有人可以解釋為什么嗎?
uj5u.com熱心網友回復:
生成器是惰性迭代器。您可以像串列一樣遍歷它們,但是一旦這樣做,它們就會筋疲力盡,即什么也沒有留下。使用以下行,
gen = ((i in b) for i in a)
print(gen)
您創建一個生成器物件,然后使用以下回圈,
for i in gen:
print(i)
你用盡它。順便說一句,你也累著b累著gen。所以到最后一行時,b是空的,所以你的函式將始終回傳 False。
IIUC,您要評估是否a是 的子序列(不是子集)b。所以順序很重要。您可以將函式更改為:
def is_subsequence(a, b):
b = iter(b)
return all(((i in b) for i in a))
它會按預期作業。
輸出:
res1 = is_subsequence([1, 3, 5], [1, 2, 3, 4, 5]) # True
res2 = is_subsequence([1, 4, 3], [1, 2, 3, 4, 5]) # False
uj5u.com熱心網友回復:
您遇到的主要問題是運算式i in bwhenb是迭代器。檢查迭代器中的成員資格會迭代這些值。True如果找到值(從迭代器消耗值直到并包括找到的值),或者False迭代器首先用完,它就會回傳。不幸的是,如果您要求迭代器以錯誤順序生成的值,您很容易錯過其中的一些。這是一個更簡單的例子:
b = iter([1,2,3])
print(1 in b) # prints True
print(3 in b) # prints True, but skipped over 2 to get there
print(2 in b) # prints False, since the iterator is exhausted after seeing 3
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/398299.html
上一篇:如何從標題串列列構建命名串列?
下一篇:c#資料計數查詢
