2012-04-18 42 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 
相关问题