當您執行類似'0' or '4'
的操作時,or
操作員將驗證第一個參數('0'
)是否爲false-ish,如果不是false,則返回第一個值。由於'0'
是不是假的(它是一個非空字符串,如布爾使用時產生True
),它將返回的第一個值和下面的一個甚至不會考慮:如果您重複它
>>> '0' or '4'
'0'
,你會得到相同的結果:
>>> '0' or '4' or '6' or '8'
'0'
此外,in
運營商具有更大的優先級,所以它會每次or
前執行:
在 '88' '0' 或 '4' 或 '6' 或 '8' '0'
你想在你的病情做的是驗證任何值是結果:
>>> '0' in str(i) or '4' in str(i) or '6' in str(i) or '8' in str(i)
True
>>> i = 17
>>> '0' in str(i) or '4' in str(i) or '6' in str(i) or '8' in str(i)
False
這還不是最完美的解決方案,但它是你的意圖的最好的翻譯。
那麼,什麼是優雅的解決方案?作爲sugested通過@sven,您可以創建尋求字符的集合(more about it):
>>> sought = set("0468")
>>> sought
set(['0', '8', '4', '6'])
,然後創建了一套在你的電話號碼位數:
>>> i = 16
>>> set(str(i))
set(['1', '6'])
現在,只是看看they are disjoint:
>>> i = 16
>>> sought.isdisjoint(set(str(i)))
False
>>> i = 17
>>> sought.isdisjoint(set(str(i)))
True
在這種情況下,如果設定是不脫節,那麼要保留它:
>>> found = []
>>> for i in range(100):
... if sought.isdisjoint(set(str(i))):
... found.append(i)
...
>>> found
[1, 2, 3, 5, 7, 9, 11, 12, 13, 15, 17, 19, 21, 22, 23, 25, 27, 29, 31, 32, 33, 35, 37, 39, 51, 52, 53, 55, 57, 59, 71, 72, 73, 75, 77, 79, 91, 92, 93, 95, 97, 99]
大多數時候,每次你讓自己創造一個for
環路濾波迭代器的時候,你真正需要的是一個list comprehension:
>>> [i for i in range(100) if sought.isdisjoint(set(str(i)))]
[1, 2, 3, 5, 7, 9, 11, 12, 13, 15, 17, 19, 21, 22, 23, 25, 27, 29, 31, 32, 33, 35, 37, 39, 51, 52, 53, 55, 57, 59, 71, 72, 73, 75, 77, 79, 91, 92, 93, 95, 97, 99]
或者,用笨拙,但更多的新手友好構建:
>>> [i for i in range(100) if not ('0' in str(i) or '4' in str(i) or '6' in str(i) or '8' in str(i))]
[1, 2, 3, 5, 7, 9, 11, 12, 13, 15, 17, 19, 21, 22, 23, 25, 27, 29, 31, 32, 33, 35, 37, 39, 51, 52, 53, 55, 57, 59, 71, 72, 73, 75, 77, 79, 91, 92, 93, 95, 97, 99]
你還在修改'test'在遍歷它。 –
你是對的,我只是試圖接近這個問題。我會修復我的答案 –
謝謝,但即使你願意,這也會是公平的:) –