如果键可能不存在,则从Python dict读取

如果键可能不存在,则从Python dict读取,python,json,Python,Json,我对Python和解析数据非常陌生 我可以将外部JSON提要拉入Python字典并在字典上迭代 for r in results: print r['key_name'] 当我遍历返回的结果时,当一个键没有值时,我会得到一个错误(一个记录的值可能并不总是存在)。如果我打印结果,它显示为 'key_name': None, 'next_key':................. 我的代码因错误而中断。如何控制没有值的键 任何帮助都将不胜感激 Brock使用has_key(),这将以

我对Python和解析数据非常陌生

我可以将外部JSON提要拉入Python字典并在字典上迭代

for r in results:
     print r['key_name']
当我遍历返回的结果时,当一个键没有值时,我会得到一个错误(一个记录的值可能并不总是存在)。如果我打印结果,它显示为

'key_name': None, 'next_key':.................
我的代码因错误而中断。如何控制没有值的键

任何帮助都将不胜感激


Brock

使用has_key(),这将以首选方式返回true或false,如果适用:

for r in results:
     print r.get('key_name')
如果
key\u name
不是字典中的键,则只需打印
None
。您也可以使用不同的默认值,只需将其作为第二个参数传递:

for r in results:
     print r.get('key_name', 'Missing: key_name')
如果要执行与使用默认值不同的操作(例如,在缺少键时完全跳过打印),则需要更多的结构,即:

for r in results:
    if 'key_name' in r:
        print r['key_name']


第二个可能更快(如果比丢失钥匙更罕见的话),但第一个对许多人来说似乎更自然。

[更新以消除粗心的错误]

你也可以这样做:

for r in (row for row in results if 'a' in row):
    print r['a']
这使用生成器表达式从“结果”中选择“行”,其中“行”包括键“a”

下面是一个小测试脚本:

results = [{'a':True}, {'b':True}, {'a':True}]
for r in (row for row in results if 'a' in row): print r['a']

如果可能,可以使用simplejson库来管理JSON数据。

如果没有密钥,有两种直接的方法可以读取Python dict。例如:

dicty={'A':'hello','B':'world'}

  • 访问键值对的Python方式是:
  • value=dicty.get('C','defaultvalue')

  • 非肾盂途径:
  • value=dicty['C']如果dicty['C']是“默认值”

  • 更糟糕的是:
  • 试试看:
    value=dicty['C']
    除KeyError外,如下所示:
    
    value='默认值'

    您可以使用内置函数


    这个线程中的最初问题是为什么我编写了Dictor库,它可以优雅地处理JSON回退和None值,而不需要try/except或If块

    还提供了其他选项,如忽略大写/小写

    看,


    d.has\u key(k)
    现在已不推荐使用。您应该在新代码中使用d中的
    k
    [r.get('key_name')表示结果中的r]
    @Parand:您在哪个版本的Python上测试过它?您的
    for
    语句在Python2.6和3.1中都出现了语法错误。对不起,John,这是一个粗心的错误。修复了脚本,现在应该可以在Python2.5+上使用。是否有一种方法可以使用get获得键的子键?假设您有一个dict,{data:{'moredata':'value','evenmoredata':'anothervalue'},.get可以用于.get('data'),但是否还有其他方法可以访问.get('data')['moredata']@brizz,你刚才写的表达方式与你举的例子很吻合。对于任何更复杂的问题,我建议问一个单独的问题,而不是试图在评论线程中劫持一个5年前的问题如果密钥不存在,它就不存在。我之所以在这里发帖,是因为它在谷歌搜索结果中显示为最热门的答案之一。。(我使用“get”的原因是键可能存在,也可能不存在)。道歉,如果这不是犹太教-但搜索是我如何遇到这一点,并知道其他人也会。python IRC对于.get()子键没有很好的答案。如果没有解决办法,我会再提出一个问题。也许只需要在.get()?@brizz中做一个if,发布另一个问题,你就会得到答案——在一个非常老的问题的评论线程中隐藏另一个问题的答案是违反SO礼仪的第二个最糟糕的例子(最糟糕的是在评论中隐藏不同的问题,就像你正在做的那样)。
    results = [{'a':True}, {'b':True}, {'a':True}]
    for r in (row for row in results if 'a' in row): print r['a']
    
    key='key_name'
    # or loop your keys 
    
    if hasattr(e, key):
      print(e[key])
    else:
      print('No key for %s' % key)