从字典字典中读取特定键值

时间:2015-06-09 17:55:15

标签: python dictionary

我有一本字典词典如下:

dictofdict = {'001': {'date': 201504, 'status':'New'}, '002': {'date':201504, 'status':'Constant', 'rate':'-10'}, '003':{'date': 201504, 'status':'In Review'}}

内部词典可能包含也可能没有以下所有键:日期,状态和费率。例如:001和003的值字典中没有密钥率。

如何阅读这本字典词典,以便输出如下。我只对内部词典中的日期和状态键感兴趣。

201504    001    New
201504    002    Constant
201504    003    In Review

2 个答案:

答案 0 :(得分:7)

您可以使用if子句检查它们是否存在于内部词典中

>>> for k,v in dictofdict.items():
...      if 'date' in v and 'status' in v:
...           print("{}\t{}\t{}".format(v['date'],k,v['status']))
... 
201504  003 In Review
201504  002 Constant
201504  001 New

如果您特别关注订单,则必须使用sorted作为字典,否则无法订购

>>> for k,v in sorted(dictofdict.items()):
...      if 'date' in v and 'status' in v:
...           print("{}\t{}\t{}".format(v['date'],k,v['status']))
... 
201504  001 New
201504  002 Constant
201504  003 In Review

作为Padraic mentions,您可以使用列表推导来存储这些值。

[(k, d["date"], d["status"]) for k, d in sorted(dictofdict.items()) if "date" in d and "status" in d]

这可以用作

>>> l = [(k, d["date"], d["status"]) for k, d in sorted(dictofdict.items()) if "date" in d and "status" in d]
>>> for i,j,k in l:
...     print("{}\t{}\t{}".format(i,j,k))
... 
201504  001 New
201504  002 Constant
201504  003 In Review

如下面的JonCle mentions

您也可以在条款中使用set.issubset

这可以用作

>>> for k,v in sorted(dictofdict.items()):
...       if {'date', 'status'}.issubset(v):
...            print("{}\t{}\t{}".format(v['date'],k,v['status']))
... 
201504  001 New
201504  002 Constant
201504  003 In Review

最后一种方法是EAFP。被称为更容易请求宽恕而非许可,您可以完全避免if条款!

>>> for k, v in sorted(dictofdict.items()):
...     try:
...         print '{date}\t{}\t{status}'.format(k, **v)
...     except KeyError:
...         pass
... 
201504  001 New
201504  002 Constant
201504  003 In Review

这是因为我们假设密钥存在于字典中。如果不存在,则会引发异常。在这里,我们选择忽略它,因为它不是我们所必需的。

注意:

正如你在这里有一个字典,你可以利用这里的format方法来打印字典的键(你可以看到几个例子here)并提供字典的键作为format

中的字段

这可以作为

完成
print('{date}\t{}\t{status}'.format(k, **v))

答案 1 :(得分:0)

为此,您需要检查内部词条是否包含键var sum = 0.0; for(int i=0;i<data.Length;i++) sum += Math.Max(data[i],0); public static unsafe float FasterCompare(float value) { var val = *(int*) &value; return val > 0 ? value : 0; } 。另外,要按顺序打印,您可以使用status功能。

date