2012-04-18 41 views
3

我需要幫助檢查二維列表中的所有項目是否相同(在這種情況下,我檢查它們是否都等於一)。如何檢查2D列表中的所有項目是否都一樣?

我做了一個函數allOnes(L),檢查所有項目是否在1D數組中是1。我用這樣的all()函數:

def allOnes(L): 
    """Tests to see if the numbers in the list L are all 1's 
    """ 
    return all(x == 1 for x in L) 

現在我需要檢查2D列表中的所有項目是否都是1。我希望函數allOnes2d在檢查如下列表時返回True:[[1,1,1], [1,1,1], [1,1,1]]。這可能使用all()

回答

4
def allOnes2d(L): 
    return all(allOnes(a) for a in L) 

而且做任何尺寸的陣列,使用itertools.chain到N維數組減少到正規的一個,然後把它交給你的allOnes功能。 (感謝Lattyware)

+0

[''itertools.chain''](http://docs.python.org/library/itertools.html#itertools.chain)大於一個更好的選擇在這裏列出理解。 – 2012-04-18 18:53:16

+0

啊,是的,這更適合。我會改變我的答案。 – jimw 2012-04-18 18:55:08

3

快速矩形陣列使用numpy。

import numpy 
table= numpy.array([[1,1,1], [1,1,1], [1,1,1]]) 
print numpy.all(table == 1) 
1

雖然使用all()和您定義的函數是做一個好辦法,你也可以看看這個替代

>>> from itertools import chain 
>>> sum(1 for e in chain(*[[1,1,1], [1,1,1], [1,1,1]]) if e!= 1) 
0 

,或者您也可以通過itertools.chain

展開列表後調用 allOnes
>>> allOnes(chain(*[[1,1,1], [1,1,1], [1,1,1]])) 
True 
>>> 
1

我喜歡這種事遞歸:

from collections import Iterable 
def allOnes(I): 
    if isinstance(I, Iterable): 
     return all(allOnes(i) for i in I) 
    else: 
     return I == 1 

一個例子:

>>> L = [[1,1,1], (1,1,1), 1] 
>>> allOnes(L) 
True 
>>> L = [[1,1,1], (1,0,1), 1] 
>>> allOnes(L) 
False 
相關問題