2016-03-22 1 views
0

У меня есть объект JSON, что:Вложенные словари, возврата определенных клавиш в Python

zt123

zt3653

zt777 ..etc.

Я пробовал следующее, но думаю, что я слишком усложняю это. Есть ли упрощенный способ?

def extract(dict_in, dict_out): 
    for key, value in dict_in.iteritems(): 
     if isinstance(value, dict): # If value itself is dictionary 
      extract(value, dict_out) 
     elif isinstance(value, unicode): 
      # Write to dict_out 
      dict_out[key] = value 
    return dict_out 

ответ

0

они всегда будут вложены в -> интерфейсы -> Интерфейс -> ZT

Если он находится в фиксированном положении просто называют эту позицию:

hosts1_xxxxxxx= { 
    "line": {}, 
    "interfaces": { 
     "interface": { 
      "zt123": {}, 
      "zt456": {}, 
     }, 
    }, 
} 
zts = list(hosts1_xxxxxxx["interfaces"]["interace"].keys()) 
print(zts) 
# ["zt123", "zt456"] 
0

Вот общий способ сделать это (для любой глубины в Словаре) -

# This function takes the dict and required prefix 
def extract(d, prefix, res=None): 
    if not res: 
     res = [] 
    for key, val in d.iteritems(): 
     if key.startswith(prefix): 
      res.append(key) 
     if type(val) == dict: 
      res = extract(val, prefix, res[:]) 
    return res 

# Assume this to be a sample dictionary - 
d = {"zt1": "1", "zt2":{"zt3":{"zt4":"2"}}} 
res = extract(d, "zt") 
print res 

# Outputs- 
['zt1', 'zt2', 'zt3', 'zt4'] 

В основном это перебирает каждый ключ и использует функцию startswith, чтобы выяснить, если ключ начинается с zt

+0

использования прямо 'res = []' в качестве значения по умолчанию вместо тестирования для 'None'. И замените 'type (val) == dict' на пифоновский путь, который Марк Бабатунде связал:' isinstance (val, dict) '. – Chickenmarkus

+0

@Chickenmarkus с 'res = []', мы используем изменяемые типы как необязательный параметр, который может привести к неожиданному поведению позже, когда код растет (это случалось со мной пару раз). – Kamehameha

+0

Ага, это явление называется «изменчивыми аргументами по умолчанию». Я боролся с ним только один раз с более сложным типом, чем список. https://pythonconquerstheuniverse.wordpress.com/2012/02/15/mutable-default-arguments/ – Chickenmarkus