【问题标题】:Iterate a Nested Dictionary in Python在 Python 中迭代嵌套字典
【发布时间】:2016-11-30 21:47:26
【问题描述】:

我的字典结构如下:

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 总数,但是我试图将投资组合百分比添加到每只股票的那条线工作不正常——这只是奇怪的只出现一只股票。有人可以建议吗?

【问题讨论】:

  • 关注@jDo,ticker 来自哪里?
  • @jDo 对不起,我没有包含我从 excel 文件中读取并分配值的顶部代码。那个单引号只是我在这里输入代码的一个错误。我刚刚编辑了我的帖子以包含价值分配。
  • 有没有一种好方法也可以按“部门”对库存百分比求和?例如,要获取所有行业的列表以及该行业的总百分比......所有股票?

标签: python python-3.x dictionary


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    这就是你想要的:

    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
    

    【讨论】:

      【解决方案3】:

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

      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 dict 的值将附加键保存为percentage

      【讨论】:

      • 这太完美了!奇迹般有效!非常感谢,我仍然是 Python 的初学者,但我非常感谢那些比我聪明得多的人的建议。
      • 不用谢谢。如果你觉得答案有用,accept the answer。它可能会帮助其他人将来面临同样的问题
      猜你喜欢
      • 1970-01-01
      • 2014-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-05
      • 2021-11-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多