如果我有一個項目列表,最後會列出一個二進制數字,我該如何讓程序說出數值錯誤(或類似的東西)當列表長度超過8個數字,而不是一個1或一個0?Python - 如何提高列表中多個項目的值錯誤
即[1,0,2,0,1,0,0,0,1] 這應該會出現錯誤,表明該列表中包含非1或0數字及其多於8個數字。
如果我有一個項目列表,最後會列出一個二進制數字,我該如何讓程序說出數值錯誤(或類似的東西)當列表長度超過8個數字,而不是一個1或一個0?Python - 如何提高列表中多個項目的值錯誤
即[1,0,2,0,1,0,0,0,1] 這應該會出現錯誤,表明該列表中包含非1或0數字及其多於8個數字。
這將做到這一點。無論你想它的清潔是由你:
if len(l1) != 8 or len([n for n in l1 if n not in (1, 0)]) != 0:
raise ValueError('Invalid entries or incorrect length')
if len(my_list) > 8 or any((x is not 0) and (x is not 1) for x in my_list):
raise ValueError
不產生任何中間列表,並停在第一個壞的數字(以及對數少於八位工作)。
如果你想接受像True
值1
或False
爲0
,
if len(my_list) > 8 or any(x in (0, 1) for x in my_list):
raise ValueError
的工作方式相同。
'x不在(0,1)'是更pythonic(實際上它使條件看起來幾乎像純英文:)) –
我想到了這一點,但我不知道它是更Pythonic,這是錯誤的 - (0,1)中的假是'真'。 – agf
該死的..(blabla字符去) –
你可以做這樣的事情:
def typeoferror(mybytes):
return [
len(mybytes) != 8,
any(True for i in mybytes if i not in [0,1])
]
,然後用它來測試:
if typeoferror(mybytes)[0] and typeoferror(mybytes)[1]:
raise ValueError('Is not 8-items long and has elements other than 0 or 1')
elif typeoferror(mybytes)[0]:
raise ValueError('Is not 8-items long')
elif typeoferror(mybytes)[1]:
raise ValueError('Has elements other than 0 or 1')
在行動相同的代碼:http://codepad.org/tih9ewKq
當然,你可以緩存的結果功能typeoferror()
獲得一些性能。
這是你要求的嗎?
編輯:
解變得更加高效,通過agf的建議。
如果你有多個案例,它們應該在函數內部,而不是在它之外,我不相信你想出了一個比@gddc更低性能的版本 - 你優化了一個未優化的解決方案。此外,他還說:「當列表長度超過8個數字時」不是「當列表長度大於或小於8個數字時」。 – agf
事實上,他是唯一回答完全回答這個問題的答案:「這會給出一個錯誤,說明列表中有一個非1或0的數字及其多於8的數字。」 –
@agf你可能會部分正確。不過,我相信,我的解決方案更接近回答這個問題,而不是你的答案。正如布倫特所說:「_error說列表中有一個非1或0的數字**和**它的多於8個數字_」,因此是多個情況。該功能只是爲了確定錯誤,而不是拋出一個錯誤。它只是作爲一個概念證明(如果你可以這樣調用一些簡單的代碼)。 – Tadeck
謝謝sooo much – tyim
''n'只是每個物品的名稱,因爲它從列表中抓取它。另外,如果n不在((1,0))中,而不是在len中(如果n不在(1,0)])!!= 0中,做同樣的事情,但速度更快,內存更少。 – agf
@tyim - 這只是List Comprehension語法。 'n'可以是你想要使用的任何變量名稱。它是初始列表的各個值的佔位符,以便我們可以依次檢查它們。 –