假设我有以下列表:
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] ]
要判断每个子列表中是否有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
编辑:替代方案包括:
map(lambda x: x.count(1), l) == [n] * len(l)
}}set(i.count(1) for i in l) == {n}
}}(在此答案中最有效的方法)但我认为最干净的方法是另一个回答者提供的{{link3:方法}}:
all(i.count(1) == n for i in l)
这甚至相当容易理解。
L = [[0,0,1,1],[1,1,1,1]]
,它会在 check(L, 2)
和 check(L, 4)
中都返回 False。你介意证明一下吗? - TadeckL = [[1,2],[1,1,1]]
。对于这个实例,check(L,3)
仍然返回 True
。值得一提的是,您假设列表最初只包含0和1。 - mgilsonsum(sl)
。您可以获取子列表的唯一计数集并测试它们是否都有三个1,如下所示:
set( sum(sl) for sl in L ) == set([3])
虽然与使用all()
方法相比有点晦涩,但这种方法也可以让您测试所有子列表是否具有相同数量的“1”,而无需指定数量:
len(set( sum(sl) for sl in L )) == 1
你甚至可以“断言”子列表必须具有相同数量的1,并在一次操作中发现该数字:
[n] = set( sum(sl) for sl in L )
这将每个子列表中的1的数量分配给n
,但如果子列表不都具有相同的数量,则会引发ValueError
。
L = [[1,2], [1,0,1,1]]
将返回 True
,因为每个子列表的总和仍然为3(但当然,这个列表违反了你事先声明的假设)。 - mgilsonsum(sl)
更改为sl.count(1)
,其他所有内容仍然有效。 - Marcelo Cantosdef 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
return all(sub_list.count(elem) == count for sub_list in lst)
更加简洁,而且由于all
函数会在第一个False
出现时停止迭代,因此可能会更快。当然,如果你真的想要提高性能,仍然需要使用基准测试来确定哪种方法更快。 - Peter Grahamall( (x.count(e) == c for l in lst) )
,但是在 all
中括号是不需要的?每天都有新的学习。 - yurisich
count_function(lst, number, value=1)
函数是不是更好的想法呢? - Tadeck