2015-04-13 6 views
1

у меня есть данные в JSON файл в таком видеполучать только внутренние ключи от вложенного словаря

[ 
    { 
     "FIRST NAME": "Nasim", 
     "EMAIL": "[email protected]", 
     "ADDLINE1": "855-8805 Nunc. Avenue", 
     "CITY": "Masterton", 
     "LOCATION":{"ADDLINE2":"855-8805", 
        "ADDLINE3":"Avenue", 
        "PIN":"100", 
        "ZIP":{"AREA":"5645", 
          "STREET":"hgh", 
          "MAIN":"87" 
        }} 
    }, 
    { 
     "FIRST NAME": "Xanthus", 
     "EMAIL": "[email protected]", 
     "ADDLINE1": "357-4583 Curae; St.", 
     "CITY": "Basildon", 
     "LOCATION":{"ADDLINE2":"357-4583", 
        "ADDLINE3":"Curae; St.", 
        "PIN":"101", 
        "ZIP":{"AREA":"546", 
          "STREET":"yjtyj", 
          "MAIN":"56" 
        }} 
    } 

как я перечислить только ключи в этой форме FIRSTNAME EMAIL ADDLINE1 ГОРОД РАЗМЕЩЕНИЯ {ADDLINE2, ADDLINE3, PIN, ZIP {AREA, УЛИЦА, MAIN}}

я реализовал это

for key in row.iterkeys(): 
    print key 
    for items in row[key]: 
     print items 

но я получаю даже ценности вместе с ним. даже если глубина увеличивается, он должен иметь возможность перечислять все подразделы. нужен выход в такой форме

FIRSTNAME 
LOCATION 
    ADDLINE2 
    ADDLINE3 
    PIN 
    ZIP 
    STREET 
    MAIN 
    AREA 
ADDRESS 
EMAIL 

ответ

0

Вы можете попробовать следующий рекурсивный метод:

def get_keys(d): 
    for key in d.iterkeys(): 
     yield key 
     if isinstance(d[key], dict): 
      yield list(get_keys(d[key])) 

for row in data: 
    print list(get_keys(row)) 

С data быть вашим гнездовой словарь, это дает вам этот вывод:

['ADDLINE1', 'FIRST NAME', 'LOCATION', ['ADDLINE3', 'ADDLINE2', 'ZIP', ['STREET', 'MAIN', 'AREA'], 'PIN'], 'EMAIL', 'CITY'] 
['ADDLINE1', 'FIRST NAME', 'LOCATION', ['ADDLINE3', 'ADDLINE2', 'ZIP', ['STREET', 'MAIN', 'AREA'], 'PIN'], 'EMAIL', 'CITY'] 

Примечание что порядок ключей может отличаться от исходного словаря, так как нет гарантии в каком порядке d.iterkeys() (или любой другой аналогичный метод) будет производить ключи.

Если вы хотите, чтобы превратить эти в строки в формате, показанном на ваш вопрос, вы могли бы использовать это:

def to_string(keys): 
    return " ".join("{" + to_string(key) + "}" if isinstance(key, list) else key.replace(" ", "") for key in keys) 

Результат будет ADDLINE1 FIRSTNAME LOCATION {ADDLINE3 ADDLINE2 ZIP {STREET MAIN AREA} PIN} EMAIL CITY. Обратите внимание, что это сбрасывает ключи, такие как FIRST NAME, до FIRSTNAME (как и в вашем примере), в противном случае вам нужно использовать какой-либо другой разделитель, кроме " ", например. вместо этого используйте ", ".join(...). Лично я предпочел бы оставить это как список, а не превратить его в строку.

+0

спасибо много .. не знаю, что экземпляр может быть использован. – Shadow

+0

как я могу преобразовать его в строку, чтобы получить результат в этой форме – Shadow

+0

thank u so much .. :) – Shadow

0

Рекурсивный решение может быть:

def getkeys(x): 
    result = [] 
    for k, v in x.items(): 
     result.append(k) 
     if isinstance(v, dict): 
      result += getkeys(v) 
    return result 

map(getkeys, your_json_objects_list) 

[[ 'ADDLINE1', 'FIRST NAME', 'МЕСТОНАХОЖДЕНИЕ', 'ADDLINE3', 'ADDLINE2', 'ZIP', 'STREET' , 'MAIN', 'AREA', 'PIN', 'EMAIL', 'CITY'], ['ADDLINE1', 'FIRST NAME', 'LOCATION', 'ADDLINE3', 'ADDLINE2', 'ZIP', ' STREET», 'MAIN', 'AREA', 'PIN', 'EMAIL', 'СИТИ']]

+0

Я думаю, он хочет, чтобы ключи были вложенным списком, а не как плоский список. –

+0

Возможно, вы правы. Пример выглядит как странная смесь списка и диктовать мне ... – Lachezar

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