迭代嵌套的字典在Python

迭代嵌套的字典在Python

问题描述:

我的字典的结构为这样:迭代嵌套的字典在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

有没有一种很好的方式来按“部门”来总结股票百分比?例如,以获得所有部门的名单,该部门的所有股票的百分比...... –

如果我理解你的问题正确的话,你可以尝试如下(我只是复制了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') 

这是你想要什么:

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 

您的问题可以分为两个部分来解决:

  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)。这可能有助于未来面临同样问题的其他人 –