2010-12-16 63 views
6

真的有两个问题:如果我有一个字典(最初来自解析一个json消息),有一个可选的数组在它:Python:结合“如果'x'在字典中”和“为我在字典['x']”

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 

我的第一个问题是,有没有什么蟒蛇办法的,如果保护和for循环结合起来?

第二个问题是我的直觉告诉我要原来的JSON消息的更好的设计是始终指定孩子元素,只是一个空的字典:

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

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

回答

10
for x in d.get("kids",()): 
    print "kid:", x 
7

空序列不会导致迭代。

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

对于任何不知道的人,'dict.get(key,default)'返回与'key'关联的值(如果存在)或'default'(如果不存在)。 – DGH 2010-12-16 18:50:01

+1

...并且'()'是空的元组。本能地,我会用'[]'去,但是没有实际的区别。 – delnan 2010-12-16 18:51:35

+0

@delnan很可能你的本能是使用[],因为许多标准库函数返回列表,而不管输入序列类型如何(例如'sorted')。我的本能是喜欢(),因为它记录了我没有做任何需要列表的结果的愿望。 ;) – 2010-12-16 22:14:22

4

[x for x in dict_with.get('kids')],您可以使用此filter, map - a functional programming tools与列表理解。

  • 列表理解写得更简洁。
  • 运行速度比手动循环语句快得多。
  • 要避免key-error使用dict_with.get('xyz',[])返回一个空的列表。