我有一个看起来像这样的数据结构Q =(A,(B,C))。 Len(Q)显然等于2.但我只关心叶子(A,B,C)。我可以使用哪个函数返回函数(Q)= 3?
答案 0 :(得分:0)
def count_nodes(tree):
if not tree:
return 0
elif type(tree) == str:
return 1
else:
return count_nodes(tree[0]) + count_nodes(tree[1:])
tree = ('a', ('b', ('d', 'e'), 'c', ('f', 'g')))
print count_nodes(tree) # prints 7
那就是说,如果您想要的是叶子(在您的示例中为(B,C)
),您可以将其转换为字符串,使用正则表达式并恢复:
import re
tree = ('a', ('b', ('d', 'e'), 'c', ('f', 'g')))
res = re.findall(r'\([^(]+?\)', str(tree))
res = map(eval, res)
print res # [('d', 'e'), ('f', 'g')]
答案 1 :(得分:0)
您可以使用递归函数:
def rec_len(thing):
if isinstance(thing, basestring):
return 1
try:
return sum(rec_len(x) for x in thing)
except TypeError:
return 1
请注意,您必须防范类似字符串的内容。因为否则你最终会计算叶子节点的字母数。
答案 2 :(得分:0)
def flatten(container):
for i in container:
if isinstance(i, list) or isinstance(i, tuple):
for j in flatten(i):
yield j
else:
yield i
sum(1 for _ in flatten(Q))
答案 3 :(得分:0)
def flatten(q):
if not q:
return 0
if isinstance(q, tuple):
if not isinstance(q[0], tuple):
return 1+flatten(q[1:])
else:
return flatten(q[0]) + flatten(q[1:])
else:
return 1