Python:组合“if 'x' in dict”和“for i in dict['x']”
其实有两个问题:如果我有一个字典(这个字典是从解析一个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来写?
第二个问题是,我觉得原始的json消息设计得更好应该是总是指定“孩子”这个元素,即使它是一个空的字典:
dict_better = {'name':'bob','city':'san francisco','kids': {} }
我找不到任何设计方法来支持这个想法。这个json消息是来自一个支持json和xml格式的网络服务的状态消息。因为他们最开始是用xml,所以“孩子”这个元素是可选的,这就导致了上面提到的需要先检查这个元素是否存在,然后再遍历数组的情况。我想知道,从设计的角度来看,是否更好把这个元素设为必需的(如果没有元素的话,就用一个空数组表示)。
3 个回答
4
这段代码 [x for x in dict_with.get('kids')]
是在从一个字典中获取“kids”这个键对应的值。你还可以用 filter
和 map
这些函数式编程的工具来和列表推导式一起使用。
- 列表推导式写起来更简洁。
- 运行速度比手动写的循环要快很多。
- 为了避免出现
key-error
(键错误),可以使用dict_with.get('xyz',[])
,这样如果找不到这个键,就会返回一个空列表。
7
一个空的序列不会进行任何循环。
for k in D.get('kids', ()):
10
for x in d.get("kids", ()):
print "kid:", x
当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。