2011-08-21 135 views
0

我試圖寫的Python代碼一行以下:Python的條件語句與for循環

is_valid = False 
for single_object in object_list: 
    if single_object.test == test: 
    is_valid = True 

if not is_valid: 
    return 'Bad data!' 

我知道,必須有更少的代碼來完成這種方式。我的意思是,它是Python!

回答

9
is_valid = any(o.test == test for o in object_list) 

any(iterable)函數返回True如果任何iterable值都TrueFalse如果他們都不是。我使用「生成器表達式」來檢查object_list中的值並評估條件。

+0

謝謝! any()函數似乎正是我正在尋找的! –

2

較少的代碼通常不是更好的代碼。

for single_object in object_list: 
    if single_object.test == test: 
     break 
else: 
    return 'Bad data!' 

雖然這不是一個代碼行,這是少,更乾淨的代碼,並且可以說是更容易比any閱讀。速度也基本相同。

循環中的else子句只有在循環未由break語句退出時纔會執行。

我認爲這就像Pythonic一樣的解決方案。

+0

我絕對同意你的陳述「少代碼通常不是更好的代碼」。有時候,在Python中很容易陷入太多困境。我從來沒有意識到'else'子句將會被一個'break'調用。這非常棒! –

+0

謝謝。只需使用反引號''''在註釋中標記代碼。 – agf

0

@Jeremy Banks的解決方案似乎對我來說是完美的。不過,我想提出另一個。不是爲了更好(不是),而是要顯示非布爾問題的替代方案,或者是否要獲得列表中非常精確的對象(可能爲了修改或刪除它)而非常重要。

valid_one = next((o.test for o in object_list if o.test == test), None) 
if valid_one is None: 
    # not valid 
else: 
    object_list.remove(valid_one) 
    # or 
    valid_one.special_atr = 42