4

次のリストがあるとします。

L=[ [0,1,1,1],[1,0,1,1],[1,1,0,1],[1,1,1,0] ]

このようなリストを取り、個々のリストの「1」の数が x の数に等しいかどうかを教えてくれるコードを書きたいと思います。したがって、code(L,3) と入力すると、L 内の各リストには 3 つの「1」が含まれているため、戻り値は「True」になります。しかし、code(L,2) を入力すると、戻り値は "False" になります。私はすべてのプログラミングに慣れていないので、私の質問が理解しにくい場合は申し訳ありません。どんな助けでも大歓迎です。

4

4 に答える 4

7

各サブリストに 3 つの 1 があるかどうかを確認するには、

all( x.count(1) == 3 for x in L )

または関数として:

def count_function(lst,number,value=1):
    return all( x.count(value) == number for x in lst )

L=[ [0,1,1,1],[1,0,1,1],[1,1,0,1],[1,1,1,0] ]
print(count_function(L,3)) #True
print(count_function(L,4)) #False
print(count_function(L,1,value=0)) #True
于 2012-09-07T00:15:17.720 に答える
1

Lベース リストで、が各「サブリスト」に期待されるn数である1場合、チェックは次のようになります。

map(sum, l) == [n] * len(l)

関数全体とテストは次のようになります。

>>> def check(l, n):
    return map(sum, l) == [n] * len(l)

>>> L=[ [0,1,1,1],[1,0,1,1],[1,1,0,1],[1,1,1,0] ]
>>> check(L, 3)
True
>>> check(L, 2)
False

編集:代替ソリューションには、たとえば次のものが含まれます。

しかし、最もクリーンなアプローチは、他の回答者の1人によって与えられたものだと思います:

all(i.count(1) == n for i in l)

それはかなり自明です。

于 2012-09-07T00:28:28.780 に答える
1

リストに 1 と 0 のみが含まれていると仮定すると、1 と 0 を非常に簡単に数えることができますsum(sl)。次のように、サブリストの一意のカウントのセットを取得し、それらすべてに 3 つの 1 があることをテストできます。

set( sum(sl) for sl in L ) == set([3])

このアプローチを使用する場合に比べて少しあいまいall()ですが、この方法では、数を指定することなく、すべてのサブリストに同じ数の 1 があることをテストすることもできます。

len(set( sum(sl) for sl in L )) == 1

サブリストがすべて同じ数の 1 を持つ必要があることを「アサート」して、1 回の操作でその数を検出することもできます。

[n] = set( sum(sl) for sl in L )

これにより、各サブリストの 1 の数が に割り当てられますが、サブリストのすべてが同じ数でない場合nは a が発生します。ValueError

于 2012-09-07T00:30:55.287 に答える
0
def all_has(count, elem, lst)
    """ensure each iterable in lst has exactly `count` of `elem`"""
    return all(sub_list.count(elem) == count for sub_list in lst)

>>> L = [ [0,1,1,1],[1,0,1,1],[1,1,0,1],[1,1,1,0] ]
>>> all_has(3, 1, L)
True
>>> all_has(2, 0, L)
False
于 2012-09-07T00:19:14.517 に答える