[英]Python counting elements of a list within a list
说我有以下列表:
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”。 我是所有节目的新手,所以如果我的问题难以理解,我很抱歉。 任何帮助,将不胜感激。
要查看每个子列表中是否有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
,但如果子列表不是全部具有相同的数字,则会引发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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.