4

这是我尝试过的:

def recursive_list_counter(l):
    sum = 0
    for e in l:
        if type(e) == type([]):
            #print e
            sum += 1
            recursive_list_counter(e)
    return sum 

# should be 6 if I count the first also
recursive_list_counter([[[13, 7], 90], 2, [1, 100, [5, [2]]], 8, 6])

我想使用递归来检索列表中的列表数量,同时计算原始列表。

4

6 回答 6

10

您的递归调用会忽略返回的内容。添加返回值:

def recursive_list_counter(l):
    sum = 0
    for e in l:
        if isinstance(e, list):
            sum += 1
            sum += recursive_list_counter(e)
    return sum 

请注意,外部列表在计数中被忽略,因此调用返回 5,而不是 6。

此外,您应该使用它isinstance()来测试对象是否属于给定类型。

如果您想查看6,请计算函数中的当前列表,并将计算嵌套列表留给递归调用:

def recursive_list_counter(l):
    sum = 1
    for e in l:
        if isinstance(e, list):
            sum += recursive_list_counter(e)
    return sum 
于 2013-10-30T10:48:49.367 回答
9

对于您给定的示例,如果您拥有的只是列表中的数字,您可以尝试转换为字符串并计算[

>>> li = [[[13, 7], 90], 2, [1, 100, [5, [2]]], 8, 6]
>>> str(li).count('[') 
6
于 2013-10-30T10:49:58.620 回答
3

我认为这应该可以解决问题。但我想我太慢了,我已经看到了其他 3 个答案。:P

#!/usr/bin/env python

def lcount(l):
    count = 0 
    if isinstance(l, list):
        count+=1
        count+=sum([lcount(x) for x in l]) 

    return count


list_ = [ [ [1, 2, 3], [1, 4, 5], [7, 8, 9]], [ 1, 2, 7], 1, 3, ]
print lcount(list_)
于 2013-10-30T10:54:33.933 回答
3

一个真正的功能解决方案是这样的:

def recursive_list_counter(li):
  return 1 + sum(map(recursive_list_counter, li)) if isinstance(li, list) else 0

要计算列表中的所有元素,请使用这个稍作改动的版本:

def recursive_element_counter(li):
  return sum(map(recursive_element_counter, li)) if isinstance(li, list) else 1
于 2013-10-30T11:00:29.240 回答
3

三个重点:

  • 用于isinstance检查类型
  • 不要sum用作变量,因为它已经是内置函数
  • 递归函数应该从停止条件开始(这里not isinstance(l, list):)

这是您的功能:

def recursive_list_counter(l):
    if not isinstance(l, list):
        return 0
    return 1 + sum(recursive_list_counter(e) for e in l)
于 2013-10-30T11:00:38.580 回答
2

其实问题很简单。每次调用recursive_list_counter时,都会创建一个新的局部变量sum,而不是增加全局变量。

sum = 0
def recursive_list_counter(l):
    global sum
    for e in l:
        if type(e) is list: #this is the same, but a better practice.
            #print e
            sum += 1
            recursive_list_counter(e)
    return sum 

recursive_list_counter([[[13, 7], 90], 2, [1, 100, [5, [2]]], 8, 6]) #returns 5

您还可以递归地递增 sum:

if type(e) is list:
    sum += 1
    sum += recursive_list_counter(e)

希望这可以帮助!

于 2013-10-30T10:49:02.323 回答