Easy way to determine a nesting level of nested tuples, in Python
是否有一种简单的方法来确定
1 | t = (4, (3, 5, (2, 4, 6, (1, 3, 5, 7)))) |
注意,如果不预先知道EDOCX1的深度(0),一个例程可能会面临递归限制,由
1 | `RecursionError: maximum recursion depth exceeded while calling a Python object`. |
号
下面生成一个更大(更深)的
1 | t = tuple(tuple(range(k)) for k in range(1,200))` |
我想这些可能有用(还没有弄清楚细节):
- 可以将
t 转换成字符串,并计算开括号的个数。 - 如果扁平元组的大小为$n$,则深度的正二次根大小为$n(n+1)/2=n$,即$n=(-1+sqrt(1+8n))/2。$
- 反复剥离(和计数)外部容器,直到最深的嵌套
- 还有其他的吗?
P.S.我想问一下,为什么在线tex不能呈现?测试:$N$
您可以将递归函数转换成您自己管理的堆栈,例如
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | t = (4, (3, 5, (2, 4, 6, (1, 3, 5, 7)))) def depth(t): max_depth = 0 A = [(t,max_depth)] while A: x,depth = A.pop() if isinstance(x, (list, tuple)): for a in x: A.append((a,depth+1)) else: max_depth = max(max_depth,depth) return max_depth print depth(1) # Prints 0 print depth((1,1)) # Prints 1 print depth(t) # Prints 4 |
这不是递归函数,因此不会达到递归限制。
您最初的问题讨论了递归限制是一个问题,但是您的示例并没有接近这个问题。我建议您使用最简单的方法,如果递归限制开始出现问题,那么只需要担心递归限制。这个问题的递归方法是找到每个元素的深度,并取最大值。
1 2 3 4 5 6 7 8 9 10 | def depth(t): try: return 1+max(map(depth,t)) except: return 0 t = (4, (3, 5, (2, 4, 6, (1, 3, 5, 7)))) print(depth(t)) # 4 t = tuple(tuple(range(k)) for k in range(1,200)) print(depth(t)) # 2 |
号
这将把字符串视为另一个嵌套级别,这可能不是您想要的,但可能无关紧要。