Python 3.5 if嵌套dict数据语句:TypeError

时间:2016-02-10 19:22:06

标签: python if-statement for-loop dictionary

private void allDone() {
        Log.i(TAG, "The choice has been made");            
        getActivity().finish(); //finish your app!.
        //NavUtils.navigateUpFromSameTask(getActivity());

      try { //Open browser!.
            Uri uri = Uri.parse("googlechrome://navigate?url=");
            Intent i = new Intent(Intent.ACTION_VIEW, uri);
            i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(i);
        } catch (ActivityNotFoundException e) {
            // Chrome is not installed
        }

}

代码:

if story['epic']['id'] == epic['id']:

TypeError: 'NoneType' object is not subscriptable

我可能认为这一切都错了,但仍然试图学习json / dict迭代以及如何比较多个。

我正在尝试从匹配ID的故事中检索相同史诗ID的数据。我知道for epic in epics: if epic['archived'] is False: print(epic['short_name'], epic['summary'], epic['story_count']) for story in stories: if story['epic']['id'] == epic['id']: print(story['summary'], story['cell']['label']) 包含story['epic']['id'],但显然我无法将其与非故事数据进行比较?

注意:['local_id']的值可能无效。

2 个答案:

答案 0 :(得分:2)

大多数JSON库将其输入转换为嵌套的public class SumOfNumbers { public static void main(String[] args) { Scanner keyboard = new Scanner(System.in); System.out.println("Number?"); int number = keyboard.nextInt(); System.out.println(recursion(number)); } public static int recursion(int number) { for (int i=0;i>number;i++) { return recursion(i); } else { return number ; } } } 。但是,除非源非常友好,否则在处理JSON输入时,您几乎总是必须处理可能省略对象的事实。

处理此问题的最佳方法是使用dict而不是直接订阅生成的dict.get(),因为它允许您在缺少密钥时提供默认值。

因此,你可以做dict代替

story['epic']['id']

这将返回故事的story_id = story.get('epic', {}).get('id', "") 值(如果存在)或空字符串。无论哪种方式,您都可以安全地将其与id

进行比较

请注意,所有中间步骤都应返回空epic['id']作为默认值 - 允许调用链继续而不会引发异常。

dict

如果你发现自己在足够的地方做这件事看起来很重复(你会:)你可以随时把它抽象成一个效用函数

mydict.get('k1',{}).get('k1.1',{}).get('k1.1.1`,{}).get('lastkey','default')

然后这样称呼它

def getnested(thedict,intermediate_keys,final_key,dflt):
    dd = thedict
    for key in intermediate_keys:
        dd = dd.get(key,{})
    return dd.get(final_key,dflt)

答案 1 :(得分:-1)

这只是意味着,

story['epic']是无对象或 epic['id']是无对象。

然后,错误消息现在有意义,您应该能够在代码逻辑中找出原因。