2016-11-30 175 views
0

我的字典的結構爲這樣:迭代嵌套的字典在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} 
    } 

,這裏是區,其中i值分配:

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總投資組合的,但在那裏我試圖投資組合的比例添加到每個股票行不工作右擊 - 它僅僅出現在其中一隻股票中的奇怪之處。有人可以建議嗎?

+1

以下@jDo,在哪裏呢'ticker'來自? – mikeqfu

+1

@j對不起,我沒有包含頂級代碼,我從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)。這可能有助於未來面臨同樣問題的其他人 –