Python:处理类JSON字典数据拆分元素时遇AttributeError求助
解决字典处理中的AttributeError问题
嘿,我来帮你搞定这个问题!首先咱们先拆解一下你遇到的错误:
你代码里的liftOver.split("[_]")是直接对整个字典对象调用split()方法,但split()是字符串才有的方法,字典根本没有这个属性,所以才会抛出AttributeError: 'dict' object has no attribute 'split'。而且你的循环逻辑也有点绕——明明已经用for key, value in liftOver.iteritems()遍历字典了,结果又在循环里重新遍历liftOver.values(),完全没用到当前循环的键值对,这就白做了外层循环的工作。
正确的解决方案思路
我们需要:
- 遍历字典的每个Contig键和对应的ref列表
- 从每个ref列表中取出第一个条目里的ref字符串(也就是每个子列表的第0个元素)
- 对这个字符串用下划线
_拆分
完整代码实现
liftOver = {"/ Contig1863": [["ref0000283e3", "-", 3681], ["ref0000283e3_ref0000283e5", "-", 7468]], "/ Contig1862": [["ref0001167e3_ref0001167e5", "-", 13438]], "/ Contig1861": [["ref0001923e3_ref0001923e5", "-", 13221]], "/ Contig1860": [["ref0000920e3", "+", 769], ["ref0000920e3_ref0000920e5", "-", 6640]], "/ Contig1867": [["ref0001036e3_ref0001036e5", "-", 14133]], "/ Contig1866": [["ref0000256e3_ref0000256e5", "+", 11744]], "/ Contig1865": [["ref0001172e3_ref0001172e5", "+", 8445]], "/ Contig1864": [["ref0000694e3_ref0000694e5", "-", 26308]], "/ Contig1869": [["ref0001325e5", "-", 396], ["ref0001325e3_ref0001325e5", "+", 17739]], "/ Contig1868": [["ref0001621e5", "+", 3742], ["ref0001621e3_ref0001621e5", "+", 14315]]} # 遍历每个Contig的键值对(Python3用items(),Python2可以用iteritems()) for contig_name, ref_entries in liftOver.items(): # 取出第一个ref条目中的ref字符串 first_ref_str = ref_entries[0][0] # 按下划线拆分字符串 split_ref = first_ref_str.split('_') # 打印结果,也可以根据需求存入新字典 print(f"Contig: {contig_name}, 拆分后的ref: {split_ref}")
代码解释
liftOver.items():遍历字典的键(Contig名称)和对应的值(ref条目列表),Python 3里用这个方法就行,Python 2可以换成iteritems()。ref_entries[0][0]:先取当前Contig对应的第一个ref条目(ref_entries[0]),再取这个条目里的第一个元素——也就是我们需要的ref字符串。first_ref_str.split('_'):对拿到的ref字符串调用split()方法,按下划线拆分得到子字符串列表。
进阶:将结果存入新字典
如果你想把结果整理成一个新字典(键是Contig名称,值是拆分后的ref列表),可以这样写:
result_dict = {} for contig_name, ref_entries in liftOver.items(): first_ref_str = ref_entries[0][0] result_dict[contig_name] = first_ref_str.split('_') # 打印最终结果字典 print(result_dict)
这样就能完美实现你想要的功能啦!
内容的提问来源于stack exchange,提问作者User192
相关产品推荐
相关产品推荐

