Python:组合“if 'x' in dict”和“for i in dict['x']”

6 投票
3 回答
4566 浏览
提问于 2025-04-16 08:38

其实有两个问题:如果我有一个字典(这个字典是从解析一个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”这个键对应的值。你还可以用 filtermap 这些函数式编程的工具来和列表推导式一起使用。

  • 列表推导式写起来更简洁。
  • 运行速度比手动写的循环要快很多。
  • 为了避免出现 key-error(键错误),可以使用 dict_with.get('xyz',[]),这样如果找不到这个键,就会返回一个空列表。
7

一个空的序列不会进行任何循环。

for k in D.get('kids', ()):
10
for x in d.get("kids", ()):
    print "kid:", x

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

撰写回答