2016-11-30 4 views
0

Моего словарь структурирован как таковые:Iterate вложенный словарь в 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 весь портфеля, но линия, где я пытаюсь добавить процент портфеля на каждую акцию не работает RIGH - это достаточно странно появляется только для одной из акций. Может ли кто-нибудь посоветовать?

+1

следующего @jDo, где делает 'ticker' родом из? – mikeqfu

+1

@jDo жаль, что я не включил верхний код, где я читаю из файла excel и присваиваю значения. Эта единственная цитата была всего лишь ошибкой во мне, набрав здесь код. Я только что редактировал свой пост, чтобы включить назначения значений. –

+0

есть хороший способ также суммировать проценты акций по «сектору»? например, чтобы получить список всех секторов с общим процентом для этого сектора ... для всех акций? –

ответ

0

Если я понимаю вас вопрос правильно, вы можете попробовать следующее (я просто скопировал 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') 
0

Это то, что вы хотите:

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 
0

Ваша проблема может быть решена в двух частях:

  1. сочти общих запасов. Для этого вы можете использовать sum() как:

    stock_sum = sum(stock_data['total'] for stock_data in stockData.values()) 
    
  2. перебирать значения для обновления записи. Так как вам не нужно 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 Словаря имеет дополнительный ключ в качестве percentage

+0

Это прекрасно! Работает как шарм! Большое вам спасибо, я все еще очень новичок в Python, но я определенно ценю советы от тех, кто гораздо умнее, чем я –

+0

Нет необходимости спасибо. Если вы найдете ответ полезным, [принять ответ] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work). Это может помочь кому-то другому, стоящему перед тем же вопросом в будущем –

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