2 回答

TA貢獻(xiàn)1859條經(jīng)驗(yàn) 獲得超6個贊
您正在查找單個值,而不是值列表。列表理解在這里沒有什么意義。
您的錯誤在于將您的測試放在列表理解的值表達(dá)式部分。這不是過濾器,而是您從循環(huán)中的(過濾的)元素構(gòu)建新列表值的部分。
在循環(huán)部分if
之后放一個for
:
[i for i in range(11) if 2 * i - 4 == 0]
這將構(gòu)建一個只有一個元素的列表,該i
值的值為 true:
>>> [i for i in range(11) if 2 * i - 4 == 0] [2]
如果您必須在一行中執(zhí)行此操作,請使用生成器表達(dá)式,然后使用該next()
函數(shù)從中獲取第一個結(jié)果:
gen = (i for i in range(11) if 2 * i - 4 == 0) result = next(gen)
i
即使i
在if
測試為真的情況下有多個可能的值,這也會為您提供最小值。
一個生成器被懶惰地評估;循環(huán)在i
達(dá)到if
測試為真的值時停止,并生成該值。next()
只返回第一個值,因此不再進(jìn)行迭代。這就像您break
在for
循環(huán)中使用一樣(除非您可以稍后繼續(xù)循環(huán))。
請注意,StopIteration
如果生成器不產(chǎn)生任何值,這可能會引發(fā)異常。next()
在這種情況下,您可以告訴返回默認(rèn)值;next()
如果StopIteration
否則會引發(fā),則返回第二個參數(shù):
result = next(gen, None)
您可以在next()
調(diào)用中組合生成器表達(dá)式;如果生成器表達(dá)式是唯一的參數(shù),您可以省略(...)
生成器表達(dá)式的括號,否則包括它們以便與其他參數(shù)區(qū)分開:
result = next((i for i in range(11) if 2 * i - 4 == 0), None)
添加回答
舉報