【发布时间】:2019-12-08 01:43:37
【问题描述】:
使用此功能:
def extract_flat_branch(nested_dict, c = []):
for i in ['left', 'op', 'right', 'func', 'value', 'args',
'ctx', 'body', 'comparators', 'ops', 'test', 'orelse', 'targets', 'slice']:
if i in nested_dict:
if isinstance(nested_dict[i], list):
for b in nested_dict[i]:
yield from extract_flat_branch(b, c+[nested_dict['_type']])
else:
yield from extract_flat_branch(nested_dict[i], c+[nested_dict['_type']])
lis = [c+[nested_dict['_type'], i] for i in filter(None, [nested_dict.get(j) for j in ['n', 'id']])]
yield from lis if lis else [c+[nested_dict['_type']]] if len(nested_dict) == 1 else []
我正在遍历并提取表示为该字典 (my_dict) 的这棵树的分支,作为字符串列表,其中树的所有分支都是平面列表的元素。但是,出于某种原因,当我这样做时:
在:
print(list(extract_flat_branch(my_dict)))
而不是得到类似这样的输出:
[[node_1, node_2, .., node_n],[node_1, node_2, .., node_n],...,[node_1, node_2, .., node_n]]
我得到:
TypeError: argument of type 'NoneType' is not iterable
基于这个blog,我认为问题是我正在使用的.get(j)。但是,如果我这样做nested_dict.get(j) or {} for j in ['n', 'id']]),我仍然会得到相同的TypeError。知道如何解决此问题并获得树分支的平面列表吗?
这是完整的跟踪:
TypeError Traceback (most recent call last)
<ipython-input-4-51bfd7bbf4e4> in <module>
1 for i,j in enumerate(a_lis):
2 print(i)
----> 3 print(list(extract_flat_branch(j)))
~/dir/util.py in extract_flat_branch(nested_dict, c)
38 if isinstance(nested_dict[i], list):
39 for b in nested_dict[i]:
---> 40 yield from extract_flat_branch(b, c+[nested_dict['_type']])
41 else:
42 yield from extract_flat_branch(nested_dict[i], c+[nested_dict['_type']])
~/dir/util.py in extract_flat_branch(nested_dict, c)
38 if isinstance(nested_dict[i], list):
39 for b in nested_dict[i]:
---> 40 yield from extract_flat_branch(b, c+[nested_dict['_type']])
41 else:
42 yield from extract_flat_branch(nested_dict[i], c+[nested_dict['_type']])
~/dir/util.py in extract_flat_branch(nested_dict, c)
40 yield from extract_flat_branch(b, c+[nested_dict['_type']])
41 else:
---> 42 yield from extract_flat_branch(nested_dict[i], c+[nested_dict['_type']])
43 lis = [c+[nested_dict['_type'], i] for i in filter(None, [nested_dict.get(j) for j in ['n', 'id']])]
44 yield from lis if lis else [c+[nested_dict['_type']]] if len(nested_dict) == 1 else []
~/dir/util.py in extract_flat_branch(nested_dict, c)
38 if isinstance(nested_dict[i], list):
39 for b in nested_dict[i]:
---> 40 yield from extract_flat_branch(b, c+[nested_dict['_type']])
41 else:
42 yield from extract_flat_branch(nested_dict[i], c+[nested_dict['_type']])
~/dir/util.py in extract_flat_branch(nested_dict, c)
40 yield from extract_flat_branch(b, c+[nested_dict['_type']])
41 else:
---> 42 yield from extract_flat_branch(nested_dict[i], c+[nested_dict['_type']])
43 lis = [c+[nested_dict['_type'], i] for i in filter(None, [nested_dict.get(j) for j in ['n', 'id']])]
44 yield from lis if lis else [c+[nested_dict['_type']]] if len(nested_dict) == 1 else []
~/dir/util.py in extract_flat_branch(nested_dict, c)
35 for i in ['left', 'op', 'right', 'func', 'value', 'args',
36 'ctx', 'body', 'comparators', 'ops', 'test', 'orelse', 'targets', 'slice']:
---> 37 if i in nested_dict:
38 if isinstance(nested_dict[i], list):
39 for b in nested_dict[i]:
TypeError: argument of type 'NoneType' is not iterable
【问题讨论】:
-
@00,我添加了完整的跟踪,感谢您的帮助
标签: python dictionary recursion data-structures