4

假设我有以下列表:

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

我想编写一个代码,它将获取一个像这样的列表,并告诉我每个列表中“1”的数量是否等于某个数字 x。因此,如果我输入 code(L,3),则返回值为“True”,因为 L 中的每个列表都包含 3 个“1”。但是,如果我输入 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是您的基本列表并且n1您期望在每个“子列表”中的数量,则检查如下所示:

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

编辑:替代解决方案包括例如:

但我相信最干净的方法是其他回答者之一给出的方法:

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

它甚至是不言自明的。

于 2012-09-07T00:28:28.780 回答
1

假设您的列表仅包含 1 和 0,您可以很容易地计算它们:sum(sl). 您可以获取子列表的唯一计数集并测试它们是否都具有三个 1,如下所示:

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

虽然与使用该方法相比有点晦涩难懂all(),但此方法还允许您测试所有子列表是否具有相同数量的子列表,而无需指定数量:

len(set( sum(sl) for sl in L )) == 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 回答