对列表内的列表递归计数



假设我们的列表中有不同数量的子列表,并希望对子列表进行递归计数

Example 1: l1 = [['a', 'bb'], ['c', 'a']] => count two sublists
Example 2: l2 = [[['c', 'x'], ['g', 'ad']], [['a', 'bb'], ['c', 'a']]] => count six sublists
关于这个主题已经有几个线程:非递归或函数中的元素。我仍然想知道是否有比调用递归函数并每次检查元素是否为列表更python的解决方案。

谢谢你的建议

你可以试试这样做:

def rec_len(obj):
return sum(1 + rec_len(e) for e in obj if isinstance(e, list))
rec_len([[['c', 'x'], ['g', 'ad']], [['a', 'bb'], ['c', 'a']]])
# 6

或非递归,使用堆栈:

def iter_len(obj):
total, agenda = 0, obj[:]
while agenda:
x = agenda.pop()
if isinstance(x, list):
total += 1
agenda.extend(x)
return total

如果只是为了区分列表和其他可迭代对象(如字符串),则必须进行某种类型检查。

由于您只对子列表的数量感兴趣,因此您可以这样做:

print(str(l2).count('[')-1)
# 6

速度:

2.04µs±139 ns/循环(7次运行,每次100000循环的平均值±std. dev)

*在假定这些括号不是子列表

的值的一部分的情况下

这是一个递归解决列表计数问题的方法:

def list_counter(list_, count=0):
for x in list_:
if isinstance(x, list):
count += 1
count = list_counter(x, count=count)
return count

的例子:

l1 = [['a', 'bb'], ['c', 'a']]
l2 = [[['c', 'x'], ['g', 'ad']], [['a', 'bb'], ['c', 'a']]]
print(list_counter(l1))
print(list_counter(l2))
>>> 2
>>> 6

试试这个(不带循环的纯递归方法):

def counter(lst, index, count):

if lst[index] == ']' and index == len(lst)-1:
print(count-1)

else:
if lst[index] == '[':
count += 1
index += 1
counter(lst, index, count)

司机:

nested_list = [[['c', 'x'], ['g', 'ad']], [['a', 'bb'], ['c', 'a']]]
counter(str(nested_list), index=0, count=0)
输出:

6

最新更新