更新和最终答案:
我的解决方案递归了一个嵌套的列表列表。如果列表包含2
,则计数设置为 1。然后添加任何子列表的计数总和。这种方法支持异构列表,其中数字和列表可以在同一级别混合,如下面的第二个使用示例所示:
import collections
def list_count(l):
count = int(2 in l)
for el in l:
if isinstance(el, collections.Iterable):
count += list_count(el)
return count
这里有几个测试用例:
my_list = [[2,3,2,2], [[2,1,2,1], [2,1,1]], [1,1,1]]
print = list_count(my_list)
# 3 is printed
my_list = [2, [2,3,2,2], [[2,1,2,1], [2,1,1]], [1,1,1]]
print = list_count(my_list)
# 4 is printed
@Akavall 的回答提醒我这可以折叠成单行。(但是当我这样做时,我总是会收到(通常是合理的)关于 SO 的可读性投诉。)
def list_count(l):
return ( int(2 in l) +
sum([list_count(el) for el in l
if isinstance(el, collections.Iterable)]) )
原始答案(不是原始问题要寻找的)
更新:@NPE 在指定预期结果后更新了他的答案。他目前的答案符合原始海报的要求。
@NPE 的(原始)答案很接近,但您问:
计算哪些列表元素包含值 2
我根据您的需要阅读:
my_list = [[2,3,2,2], [[2,1,2,1], [2,1,1]], [1,1,1]]
print(sum([1 for e in [flatten(sl) for sl in ml] if 2 in e]))
但他正在寻找3
。我的代码生成 2,因为它遍历每个顶级元素并计算它是否包含任何 2,但这不是他真正想要的。