2012-04-18 21 views
3

2次元のリスト内のすべてのアイテムが同じであるかどうかを確認するのに役立つ必要があります(この場合は、すべてが1であるかどうかを確認しています)。2Dリスト内のすべてのアイテムがすべて同じであるかどうかを確認するにはどうすればよいですか?

私はすべてのアイテムが1Dの配列にあるかどうかをチェックする関数allOnes(L)を作成しました。

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) 

そして、任意の次元の配列を行い、通常の1にN次元配列を減らすためにitertools.chainを使用し、その後、あなたのallOnes機能にそれを与えます。 (Lattywareに感謝します)

+0

[ '' itertools.chain''(http://docs.python.org/library/itertools.html#itertools.chain)は、より良いオプションでありますリストの理解をここに。 –

+0

ああ、それははるかに適切です。私は私の答えを変えます。 – jimw

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 
関連する問題