def Ancestors (otu,tree):
if tree[otu][0][0] == None:
return []
else:
return [otu,tree[otu][0][0]] + Ancestors (tree[otu][0][0],tree)
问题本质上是在某些时候,函数试图调用一个None的东西,而不是返回我想要的列表的函数。我认为if语句已经解释了,但看起来我错了。有什么建议吗?
Traceback (most recent call last):
File "<pyshell#41>", line 1, in <module>
Ancestors('A',a)
File "C:\x.py", line 129, in Ancestors
return [otu,tree[otu][0][0]] + Ancestors (tree[otu][0][0],tree)
File "C:\x.py", line 129, in Ancestors
return [otu,tree[otu][0][0]] + Ancestors (tree[otu][0][0],tree)
File "C:\x.py", line 129, in Ancestors
return [otu,tree[otu][0][0]] + Ancestors (tree[otu][0][0],tree)
File "C:\x.py", line 129, in Ancestors
return [otu,tree[otu][0][0]] + Ancestors (tree[otu][0][0],tree)
File "C:\x.py", line 126, in Ancestors
if tree[otu][0][0] == None:
TypeError: 'NoneType' object is not subscriptable
这就是树
{'A': [('AD', 4.0), None, None], 'C': [('ADBFGC', 14.5), None, None], 'B': [('BF', 0.5), None, None], 'E': [('ADBFGCE', 17.0), None, None], 'D': [('AD', 4.0), None, None], 'G': [('BFG', 6.25), None, None], 'F': [('BF', 0.5), None, None], 'ADBFG': [('ADBFGC', 6.25), ('AD', 4.25), ('BFG', 2.0)], 'BF': [('BFG', 5.75), ('B', 0.5), ('F', 0.5)], 'ADBFGC': [('ADBFGCE', 2.5), ('ADBFG', 6.25), ('C', 14.5)], 'ADBFGCE': [None, ('ADBFGC', 2.5), ('E', 17.0)], 'BFG': [('ADBFG', 2.0), ('BF', 5.75), ('G', 6.25)], 'AD': [('ADBFG', 4.25), ('A', 4.0), ('D', 4.0)]}
使用otu引用树中的任何字符串。
答案 0 :(得分:16)
这仅表示tree
,tree[otu]
或tree[otu][0]
评估为None
,因此不可订阅。最有可能是tree[otu]
或tree[otu][0]
。通过一些简单的调试来跟踪它:
def Ancestors (otu,tree):
try:
tree[otu][0][0]
except TypeError:
print otu, tre[otu]
raise
#etc...
或pdb
答案 1 :(得分:2)
您传递给Ancestors
的其中一个值会在某个时刻变为None
,因此请检查otu
,tree
,tree[otu]
或tree[otu][0]
在函数开头是None
,而不是只检查tree[otu][0][0] == None
。但也许你应该重新考虑你的行动路径和有问题的数据类型,看看你是否可以在某种程度上改善结构。
答案 2 :(得分:1)
致电a
时Ancestors('A',a)
是什么?如果a['A']
为无,或者a['A'][0]
为无,则会收到该例外。