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']}

但是,当大型 dict 条目之一没有详细信息时,我收到一个关键错误。我说我需要使用该DefaultDict模块是对的还是有更简单的方法?

4

3 回答 3

13

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

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

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

这是我经常发现自己在看的旧参考。

于 2012-07-18T18:50:26.453 回答
4

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

于 2012-07-18T18:51:16.417 回答
2

当缺少键时,使用该get(key, defaultVar)方法提供默认值:'details'

SmallDict = {d['name']:{'department':d['department'],'details':d.get('details','No details available')} for d in LargeDict['results']}
于 2012-07-18T18:52:19.313 回答