该函数接受一个列表并返回一个int,具体取决于列表中不包含列表本身的列表数量。 (为简单起见,我们可以假设所有内容都是整数或列表。)
例如:
x=[1,2,[[[]]],[[]],3,4,[1,2,3,4,[[]] ] ]
count_list(x) # would return 8
我认为使用递归会有所帮助,但我不知道如何实现它,这是我到目前为止所做的。
def count_list(a,count=None, i=None):
if count==None and i==None:
count=0
i=0
if i>len(a)
return(count)
if a[i]==list
i+=1
count+=1
return(count_list(a[i][i],count))
else:
i+=1
return(count_list(a[i]))
答案 0 :(得分:21)
您可以使用递归函数执行此操作:
def count(l):
return sum(1+count(i) for i in l if isinstance(i,list))
演示:
>>> x=[1,2,[[[]]],[[]],3,4,[1,2,3,4,[[]] ] ]
>>> count(x)
8
答案 1 :(得分:17)
这似乎可以完成这项工作:
def count_list(l):
count = 0
for e in l:
if isinstance(e, list):
count = count + 1 + count_list(e)
return count
答案 2 :(得分:5)
这是一个非递归解决方案:
代码:
def count_list(lst):
""" Given a master list, count the number of sub-lists """
stack = lst[:]
count = 0
while stack:
item = stack.pop()
if isinstance(item, list):
# If the item is a list, count it, and push back into the
# stack so we can process it later
count += 1
stack.extend(item)
return count
答案 3 :(得分:3)
没有循环的功能型解决方案。递归处理列表的第一个元素和列表的尾部。为遇到的每个空列表添加一个(也就是说,一旦我们完成处理某个列表,它的尾部变为空,我们将1添加到结果中)。并为列表本身减1。
def number_of_lists(x):
f = lambda x: 0 if not isinstance(x,list) else (f(x[0]) + f(x[1:]) if len(x) else 1)
return f(x) - 1
结果:
x=[1,2,[[[]]],[[]],3,4,[1,2,3,4,[[]] ] ]
number_of_lists(x)
>> 8
答案 4 :(得分:3)
我喜欢这种尾递归解决方案,虽然它在Python中用得不多......
def count_lists(l, counter):
if (len(l) == 0):
return counter
else:
e = l.pop(0)
if (isinstance(e, list)):
l.extend(e)
return count_lists(l, 1 + counter)
else:
return count_lists(l, counter)
x=[1,2,[[[]]],[[]],3,4,[1,2,3,4,[[]]]]
print(count_lists(x, 0))
答案 5 :(得分:0)
lst = [1,2,[[[]]],[[]],3,4,[1,2,3,4,["[[[[[][[[[[[[[[[[[["] ] ]
strlst = re.sub("'.*?'", '',str(lst))
print(strlst.count("[")-1)
在列表中添加一个字符串将使您可以对[
或]
的数量使用计数功能,为您提供答案
但是,如果列表中的字符串包含[
或]
,则它们将被包括在内
因此,使用正则表达式删除列表中的所有字符串可消除此问题