如何在列表中查找嵌套列表的数量?

时间:2014-11-12 00:31:05

标签: python list python-3.x recursion

该函数接受一个列表并返回一个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]))

6 个答案:

答案 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)

这是一个非递归解决方案:

  1. 首先,将列表中的每个项目放入堆栈
  2. 继续将一个项目从堆栈中弹出直至其耗尽
  3. 如果该项目是一个列表:a)计算它,b)将每个项目推入堆栈
  4. 代码:

    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)

在列表中添加一个字符串将使您可以对[]的数量使用计数功能,为您提供答案

但是,如果列表中的字符串包含[],则它们将被包括在内 因此,使用正则表达式删除列表中的所有字符串可消除此问题