2011-08-17 110 views
1

如果我有一個項目列表,最後會列出一個二進制數字,我該如何讓程序說出數值錯誤(或類似的東西)當列表長度超過8個數字,而不是一個1或一個0?Python - 如何提高列表中多個項目的值錯誤

即[1,0,2,0,1,0,0,0,1] 這應該會出現錯誤,表明該列表中包含非1或0數字及其多於8個數字。

回答

1

這將做到這一點。無論你想它的清潔是由你:

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') 
+0

謝謝sooo much – tyim

+0

''n'只是每個物品的名稱,因爲它從列表中抓取它。另外,如果n不在((1,0))中,而不是在len中(如果n不在(1,0)])!!= 0中,做同樣的事情,但速度更快,內存更少。 – agf

+0

@tyim - 這只是List Comprehension語法。 'n'可以是你想要使用的任何變量名稱。它是初始列表的各個值的佔位符,以便我們可以依次檢查它們。 –

1
if len(my_list) > 8 or any((x is not 0) and (x is not 1) for x in my_list): 
    raise ValueError 

不產生任何中間列表,並停在第一個壞的數字(以及對數少於八位工作)。

如果你想接受像True1False0

if len(my_list) > 8 or any(x in (0, 1) for x in my_list): 
    raise ValueError 

的工作方式相同。

+2

'x不在(0,1)'是更pythonic(實際上它使條件看起來幾乎像純英文:)) –

+0

我想到了這一點,但我不知道它是更Pythonic,這是錯誤的 - (0,1)中的假是'真'。 – agf

+0

該死的..(blabla字符去) –

0

你可以做這樣的事情:

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的建議。

+0

如果你有多個案例,它們應該在函數內部,而不是在它之外,我不相信你想出了一個比@gddc更低性能的版本 - 你優化了一個未優化的解決方案。此外,他還說:「當列表長度超過8個數字時」不是「當列表長度大於或小於8個數字時」。 – agf

+1

事實上,他是唯一回答完全回答這個問題的答案:「這會給出一個錯誤,說明列表中有一個非1或0的數字及其多於8的數字。」 –

+0

@agf你可能會部分正確。不過,我相信,我的解決方案更接近回答這個問題,而不是你的答案。正如布倫特所說:「_error說列表中有一個非1或0的數字**和**它的多於8個數字_」,因此是多個情況。該功能只是爲了確定錯誤,而不是拋出一個錯誤。它只是作爲一個概念證明(如果你可以這樣調用一些簡單的代碼)。 – Tadeck

相關問題