2012-07-18 55 views
5

我有一个从json数据创建的大型python字典,并从大的字典中创建一个较小的字典。大字典中的一些元素有一个叫'细节'的键,有些元素没有。我想要做的是检查密钥是否存在于大型字典中的每个条目中,如果不存在,则将新的字典中的值'无可用详细信息'添加到'详细信息'中。我在下面举一些示例代码来作为示例。 LargeDict在我的代码中有很多键,但我为了清晰起见保持简单。检查字典中是否存在密钥。如果没有,附加它

LargeDict = {'results': 
[{'name':'john','age':'23','datestart':'12/07/08','department':'Finance','details':'Good Employee'}, 
{'name':'barry','age':'26','datestart':'25/08/10','department':'HR','details':'Also does payroll'}, 
{'name':'sarah','age':'32','datestart':'13/05/05','department':'Sales','details':'Due for promotion'}, 
{'name':'lisa','age':'21','datestart':'02/05/12','department':'Finance'}]} 

这是我如何得到的SmallDict数据:

SmallDict = {d['name']:{'department':d['department'],'details':d['details']} for d in LargeDict['results']} 

我得到一个关键的错误然而,当大字典的一个条目没有细节。我是否正确地说我需要使用DefaultDict模块或有更简单的方法吗?

回答

2

使用get(key, defaultVar)方法提供一个默认值当'details'关键是缺少:

SmallDict = {d['name']:{'department':d['department'],'details':d.get('details','No details available')} for d in LargeDict['results']} 
13

你不需要collections.defaultdict。您可以使用字典对象的setdefault方法。

d = {} 
bar = d.setdefault('foo','bar') #returns 'bar' 
print bar # bar 
print d #{'foo': 'bar'} 

正如其他人所指出的,如果你不希望将键添加到字典中,你可以使用get方法。

这里是一个旧的reference,我经常发现自己在看。

+0

+1(从文档)dict.setdefault():“如果关键是在字典中,返回其值如果没有,默认和返回的值插入关键。默认,默认为None。“ – heltonbiker 2012-07-18 18:55:17

+0

是的。用这个。 defaultdict对于粗鲁的人来说是一种邪恶的生物。 – javadba 2015-07-31 04:52:30

+1

FWIW,我认为'defaultdict'很棒。主要的是,如果你从另一个源获得它,我认为不值得把常规的'dict'转换成'defaultdict'。通过将'default_factory'属性设置为'None'(这将使其表现得像一个常规词典一样),可以绕过'defaultdict'的“邪恶”。 – mgilson 2015-07-31 05:31:46

4

如果您想自动在dict中创建条目,则可以使用collections.defaultdict。但是,如果你不这样做,只是想“不可用”(或其他),那么你可以分配给dictd[key] = v和使用d.get(k, 'Not available')为默认值

相关问题