Итерация вложенного словаря в Python
Мой словарь имеет такую структуру:
stockData = {
'AAPL': {
'beta': 1.01833975315094,
'company_name': 'Apple',
'dividend': 1.9341673320912078,
'total':300},
'GOOG': {
'beta': 1.01833975315094,
'company_name': 'Apple',
'dividend': 1.9341673320912078,
'total':300}
}
и вот область, где я назначаю значения:
for row in range(2, sheet.max_row + 1):
# Each row in the spreadsheet has data for one census tract.
company_name = sheet['A' + str(row)].value
ticker = sheet['B' + str(row)].value
sector = sheet['C' + str(row)].value
shares = sheet['D' + str(row)].value
price = sheet['E' + str(row)].value
total = sheet['F' + str(row)].value
beta = sheet['G' + str(row)].value
dividend = sheet['H' + str(row)].value
number_stocks+=1
# Make sure the key for this ticker exists.
stockData.setdefault(ticker,{})
stockData[ticker]['company_name'] = company_name
stockData[ticker]['sector'] = sector
stockData[ticker]['shares'] = shares
stockData[ticker]['price'] = price
stockData[ticker]['total'] = total
stockData[ticker]['dividend'] = dividend
stockData[ticker]['beta'] = beta
У меня возникла проблема, при которой я повторяю цикл for по словарю, чтобы добавить новое значение "процент", которое представляет собой "итог", деленный на сумму всех итогов всех акций.
def get_portfolio_value(stocks,item):
portValue = 0
percentage = 0
for k, v in stocks.items():
portValue = portValue + v.get(item,0)
stockData[ticker]['percentage'] = stockData[ticker]['total']/portValue
print(portValue)
get_portfolio_value(stockData,'total')
проблема в том, что функция get_portfolio_value получает мне все итоговое значение portValue портфеля, но строка, в которой я пытаюсь добавить процент портфеля к каждой акции, работает некорректно - достаточно странно один из акций. Может кто-нибудь посоветовать?
3 ответа
Если я правильно понимаю ваш вопрос, вы можете попробовать следующее (я просто скопировал stockData
ниже):
stockData = {
'AAPL': {
'beta': 1.01833975315094,
'company_name': 'Apple',
'dividend': 1.9341673320912078, 'total': 300},
'GOOG': {
'beta': 1.01833975315094,
'company_name': 'Apple',
'dividend': 1.9341673320912078, 'total': 300}}
Я думаю, это то, что вы имели в виду:
def get_portfolio_value(stocks, item='total'):
portValue = 0
for v in stocks.values():
portValue += v[item]
for k in stocks.keys():
stocks[k].update({'percentage': stocks[k]['total'] / portValue})
print(portValue)
get_portfolio_value(stockData, 'total')
Ваша проблема может быть решена в двух частях:
Возьмите сумму общих запасов. Для этого вы можете использовать
sum()
как:stock_sum = sum(stock_data['total'] for stock_data in stockData.values())
Выполните итерацию по значению, чтобы обновить запись. Так как вам не нужно
key
использоватьdict.values()
перебирать только значения:for stock_data in stockData.values(): stock_data['percentage'] = stock_data['total']/stock_sum # ^ Adds new key into your existing `dict` object
Теперь значения ваших stockData
dict держит дополнительный ключ как percentage
Это то, что вы хотите:
stock_data = {
'AAPL': {'beta': 1.01833975315094, 'company_name': 'Apple', 'dividend': 1.9341673320912078, 'total':300},
'GOOG': {'beta': 1.01833975315094, 'company_name': 'Apple', 'dividend': 1.9341673320912078, 'total':300}
}
stock_sum = sum(stock_data[item]['total'] for item in stock_data)
for item in stock_data:
stock_data[item]['percentage'] = int((float(stock_data[item]['total']) / stock_sum) * 100)
Результат:
>>> for item in stock_data:
... print stock_data[item]['percentage']
...
50
50