假设我有以下列表:
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”。我是所有编程的新手,所以如果我的问题难以理解,我很抱歉。任何帮助,将不胜感激。
假设我有以下列表:
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”。我是所有编程的新手,所以如果我的问题难以理解,我很抱歉。任何帮助,将不胜感激。
要查看每个子列表中是否有 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
如果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
编辑:替代解决方案包括例如:
但我相信最干净的方法是其他回答者之一给出的方法:
all(i.count(1) == n for i in l)
它甚至是不言自明的。
假设您的列表仅包含 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
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