Python 使用递归计算列表的数量?

Python 使用递归计算列表的数量?,python,recursion,Python,Recursion,这就是我尝试过的: 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_li

这就是我尝试过的:

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])
我想使用递归检索列表中的列表数,同时计算原始列表。

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

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 

其实问题很简单。每次调用
recursive\u list\u 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
您还可以递归地递增总和:

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

希望这有帮助

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

>>> li = [[[13, 7], 90], 2, [1, 100, [5, [2]]], 8, 6]
>>> str(li).count('[') 
6

我认为这应该能奏效。 但是我想我太慢了,我已经看到了3个其他的答案

#!/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_)

真正的功能解决方案是:

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

三个要点:

  • 使用
    isinstance
    检查类型
  • 不要使用
    sum
    作为变量,因为它已经是一个内置函数
  • 递归函数应该从停止条件开始(这里:
    不是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)

我会改变
type(e)==type([])
this part要计算外部列表,只需从
sum=1
开始,然后丢失
sum+=1
。这太棒了!+1当然,只要列表中有一个包含左括号的字符串,您的解决方案就会失败。这是一种成本高昂的方法,因为此ta不需要生成字符串表示形式sk.@Alfe我知道,但还是很棒!@Alfe同意如果其中一个列表中有带括号的字符串,则该部分失败。我的回答是从假设开始的。我不同意转换为字符串的代价很高,递归意味着调用堆栈,如果没有适当的测试,我不会太确定哪一个更快。这是一个错误很好的技巧和所有,但OP询问的是递归。:-)如果要测试特定类型,请使用
is
type(e)is list
;但是使用
isinstance()更好
因为你也允许列表的子类。您好,您的注释#返回6有点误导人!您的代码实际上返回5,但这是正常的,因为我们从列表开始。@MartijnPieters谢谢,我忘记了这一点。@user2144553我不确定您是如何运行的,或者您使用的是什么输入,但是,为我运行,请参阅live examp你是在尝试我的答案的过时版本吗?事实上,我错抄了元素计数器,对不起。