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你是在尝试我的答案的过时版本吗?事实上,我错抄了元素计数器,对不起。