说我有以下列表:
L=[ [0,1,1,1],[1,0,1,1],[1,1,0,1],[1,1,1,0] ]
我想写一个代码将采用这样的列表并告诉我每个列表中的“1”数是否等于某个数字x。因此,如果我输入代码(L,3),则返回将为“True”,因为L中的每个列表包含3个“1”。但如果我输入代码(L,2),则返回“False”。我是所有节目的新手,所以如果我的问题难以理解,我很抱歉。任何帮助将不胜感激。
答案 0 :(得分: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
答案 1 :(得分: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
编辑:替代解决方案包括:例如:
但我相信最干净的方法是the one由其他一位回答者提供:
all(i.count(1) == n for i in l)
这甚至是不言自明的。
答案 2 :(得分: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
,但如果子列表的数量不同,则会引发ValueError
。
答案 3 :(得分: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