2015-06-09 2 views
0

У меня есть словарь словарей следующим образом:Чтение конкретных ключевые значений из словаря словаря

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 
+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 

Падраик 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 

Работа этого заключается в том, что мы предполагаем, что ключ присутствует в dict. Если его там нет, будет возбуждено исключение. Здесь мы решили игнорировать это, поскольку это не требуется для нас.

Примечание:

Как есть словарь здесь, вы можете воспользоваться format методом здесь, чтобы напечатать ключи словаря (Вы можете увидеть несколько примеров here) и предоставить ключи словаря, как поля в format

Это может быть сделано как

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

с 'dict.items() 'возвращает последовательность пар' (key, value) ', обычное соглашение должно называть их' k' и 'v' (если у вас нет более значимого наименования, конечно) -' i' и 'j' являются условными обозначениями для индексных переменных во вложенных C-подобных циклах 'for'. –

+0

Вам понадобится две отдельные проверки, если OP был либо ключом в случае, когда существует только один –

+0

@brunodesthuilliers Yep. Благодарю. Я отредактировал его в соответствии с соглашением –

0

чтобы сделать это, вам нужно проверить, если внутренние dicts содержат ключ status и date , Кроме того, для печати по порядку вы можете использовать функцию sorted().

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

>>> for number in sorted(dictofdict): 
    # Only print if date and status key are present in the inner dict 
    if 'date' in dictofdict[number] and 'status' in dictofdict[number]: 
     print '{}\t{}\t{}'.format(dictofdict[number]['date'], number, dictofdict[number]['status']) 


201504 001 New 
201504 002 Constant 
201504 003 In Review 
+0

Нет необходимости в 'sorted (dictofdict.keys())' just use 'sorted (dictofdict)' –

+0

Yaa не нужно для этого..thanks..edited! –

+1

Стоит также отметить, что 'has_key' был удален в Python 3.x (и был довольно устаревшим в течение некоторого времени даже в серии 2.x) ... правильный подход заключается в использовании' if 'date' в dictofdict [ number] '... –

Смежные вопросы