Python:Combine";如果';x';在dict中;及;对于dict[';x';]中的i;

Python:Combine";如果';x';在dict中;及;对于dict[';x';]中的i;,python,json,Python,Json,实际上有两个问题:如果我有一个字典(最初来自解析json消息),其中有一个可选数组: dict_with = {'name':'bob','city':'san francisco','kids': {'name': 'alice'} } dict_without = {'name':'bob','city':'san francisco' } 我通常会有如下代码: if 'kids' in dict: for k in dict['kids']: #do stuff 我的

实际上有两个问题:如果我有一个字典(最初来自解析json消息),其中有一个可选数组:

dict_with = {'name':'bob','city':'san francisco','kids': {'name': 'alice'} }
dict_without = {'name':'bob','city':'san francisco' }
我通常会有如下代码:

if 'kids' in dict:
   for k in dict['kids']:
      #do stuff
我的第一个问题是,是否有任何python方法可以将if保护和for循环结合起来

第二个问题是我的直觉告诉我,对于原始json消息,更好的设计是始终指定kids元素,只需使用一个空字典:

dict_better = {'name':'bob','city':'san francisco','kids': {} }

我找不到任何设计方法来证实这一点。json消息是来自支持json和xml表示的web服务的状态消息。因为他们是从xml开始的,所以“kids”元素是可选的,这迫使上面的构造在迭代数组之前检查元素是否存在。我想知道在设计上说元素是必需的是否更好(如果没有元素,就使用空数组)。

空序列不会导致迭代

for k in D.get('kids', ()):

[x for x in dict_with.get('kids')]
,您可以使用此
过滤器,映射-a函数式编程工具
和列表理解

  • 列表理解更简洁
  • 运行比手动for循环语句快得多
  • 要避免键错误请使用
    dict_with.get('xyz',[])
    返回空列表

对于不知道的任何人,
dict.get(key,default)
返回与
key
相关的值(如果存在),或者如果不存在,
default
。。。。
()
是空元组。本能地,我会选择
[]
,但实际上没有任何区别。@delnan您的本能很可能是使用[],因为许多标准库函数返回列表,而与输入序列类型无关(例如,
排序的
)。我的直觉是喜欢()因为它记录了我不想做任何需要列出清单的事情
for x in d.get("kids", ()):
    print "kid:", x