При разборе dict dict, есть ли опция подстановки, которую я могу использовать для доступа к вложенному dict?

#python

#python

Вопрос:

У меня есть эти данные:

  {'6': {'Change': '109,438',
  'Name': 'Prologis Inc',
  'Owned': '609,826',
  'Weight': ' 2.14'},
 '7': {'Change': '48,032',
  'Name': 'The Home Depot Inc',
  'Owned': '208,967',
  'Weight': ' 2.02'},
 '8': {'Change': '61,235',
  'Name': 'Facebook Inc A',
  'Owned': '220,558',
  'Weight': ' 2.01'},
 '9': {'Change': '32,045',
  'Name': 'NextEra Energy Inc',
  'Owned': '205,412',
  'Weight': ' 1.98'}}
 

это dict внутри dict, и я хочу извлечь «Имя» и «Вес». Я изо всех сил пытаюсь пройти первый слой (тот, который с числами), поэтому этот код не работает:

 mylist = []
stocks = holdings[0]
for s in stocks:
    m = (s['Name'], s['Weight'])
    mylist.append(m)
 

Комментарии:

1. Это зависит от того, чего вы хотите достичь, но я бы загрузил данные в фрейм данных pandas для упрощения анализа и построения графиков. df = pd.DataFrame.from_dict(stocks, orient='index') .

Ответ №1:

Вы хотите выполнить итерацию stocks.values() , чтобы получить значения, а не ключи:

 >>> [(s['Name'], s['Weight']) for s in stocks.values()]
[('Prologis Inc', ' 2.14'), ('The Home Depot Inc', ' 2.02'), ('Facebook Inc A', ' 2.01'), ('NextEra Energy Inc', ' 1.98')]
 

Ответ №2:

Это потому, что вы перебираете ключи словаря (в данном случае числа). Для перебора пар ключ-значение вы должны использовать stocks.items():

 for i, stock in stocks.items():
    m = (stock['Name'], stock['Weight'])

 

Ответ №3:

В заданных данных weight они представлены в строковом формате. Я думаю, вам нужно проанализировать вес в float.

 import json

data = {'6': {'Change': '109,438',
  'Name': 'Prologis Inc',
  'Owned': '609,826',
  'Weight': ' 2.14'},
 '7': {'Change': '48,032',
  'Name': 'The Home Depot Inc',
  'Owned': '208,967',
  'Weight': ' 2.02'},
 '8': {'Change': '61,235',
  'Name': 'Facebook Inc A',
  'Owned': '220,558',
  'Weight': ' 2.01'},
 '9': {'Change': '32,045',
  'Name': 'NextEra Energy Inc',
  'Owned': '205,412',
  'Weight': ' 1.98'}}


pairs = []
for stock in data.values():
    pairs.append((stock['Name'], float(stock['Weight'].strip())))
print(json.dumps(pairs, indent=4))
 

Вывод:

 [
    [
        "Prologis Inc",
        2.14
    ],
    [
        "The Home Depot Inc",
        2.02
    ],
    [
        "Facebook Inc A",
        2.01
    ],
    [
        "NextEra Energy Inc",
        1.98
    ]
]