【问题标题】:How to efficiently iterate through a dictionary?如何有效地遍历字典?
【发布时间】:2014-03-18 16:03:34
【问题描述】:

我是 Python 和编程新手。

我的教科书说我必须做以下问题集:

创建第二个购买摘要,按股票代码累计总投资。在里面 以上样本数据,有两块CAT。

这些可以很容易地通过创建一个字典来组合,其中 键是股票代码,值是购买的块列表。该程序通过一次 通过数据创建字典。然后通过 dict 可以创建一个报告,显示每个 股票代码和所有股票。

除了硬编码之外,我想不出一种方法来添加“CAT”股票的两个条目。

## Stock Reports

stockDict = {"GM":"General Motors", "CAT":"Caterpillar", "EK":"Eastman Kodak",
             "FB":"Facebook"}
# symbol,prices,dates,shares
purchases = [("GM",100,"10-sep-2001",48), ("CAT",100,"01-apr-1999",24),
             ("FB",200,"01-jul-2013",56), ("CAT", 200,"02-may-1999",53)]

# purchase history:
print "Company", "\t\tPrice", "\tDate\n"
for stock in purchases:
    price = stock[1] * stock[3]
    name = stockDict[stock[0]]
    print name, "\t\t", price, "\t", stock[2]
print "\n"

# THIS IS THE PROBLEM SET I NEED HELP WITH:
# accumulate total investment by ticker symbol
byTicker = {}
# create dict
for stock in purchases:
    ticker = stock[0]
    block = [stock]
    if ticker in byTicker:
        byTicker[ticker] += block
    else:
        byTicker[ticker] = block

for i in byTicker.values():
    shares = i[0][3]
    price = i[0][1]
    investment = shares * price
    print investment

现在,输出是:

4800
11200
2400

这不好,因为它没有计算两只 CAT 股票。现在它只计算一个。代码应该足够灵活,我可以添加更多的 CAT 股票。

【问题讨论】:

    标签: python python-2.7 dictionary iteration


    【解决方案1】:

    您的问题出在代码的最后一部分,倒数第二位针对每个股票代码创建了所有股票的列表,这很好:

    for i in byTicker.values():
        shares = i[0][3]
        price = i[0][1]
        investment = shares * price
        print investment
    

    在这里,您使用每个股票代码的第零个股票。相反,请尝试:

    for name, purchases in byTicker.items():
        investment = sum(shares * price for _, shares, _, price in purchases)
        print name, investment
    

    这将把每个股票的所有股票加起来,你的例子给了我:

    CAT 13000
    FB 11200
    GM 4800
    

    【讨论】:

      【解决方案2】:

      您的代码的问题在于您没有迭代购买,而只是从每个股票代码值中获取第一个元素。也就是说,byTicker 看起来像:

      byTicker: {
        "GM": [("GM",100,"10-sep-2001",48)],
        "CAT": [("CAT",100,"01-apr-1999",24), ("CAT", 200,"02-may-1999",53)],
        "FB": [("FB",200,"01-jul-2013",56)]
      }
      

      因此,当您遍历这些值时,您实际上会得到三个列表。但是当您处理这些列表时,您实际上只访问了其中的第一个:

      price = i[0][1]
      

      对于“CAT”对应的值,i[0] 为 ("CAT",100,"01-apr-1999",24)。您也应该查看 i[1] !考虑迭代不同的购买:

      for company, purchases in byTicker.items():
        investment = 0
        for purchase in purchases:
            investment += purchase[1] * purchase[3]
        print(company, investment)
      

      【讨论】:

        【解决方案3】:

        可能是这样的:

        ## Stock Reports
        
        stockDict = {"GM":"General Motors", "CAT":"Caterpillar", "EK":"Eastman Kodak",
                     "FB":"Facebook"}
        # symbol,prices,dates,shares
        purchases = [("GM",100,"10-sep-2001",48), ("CAT",100,"01-apr-1999",24),
                     ("FB",200,"01-jul-2013",56), ("CAT", 200,"02-may-1999",53)]
        
        # purchase history:
        print "Company", "\t\tPrice", "\tDate\n"
        for stock in purchases:
            price = stock[1] * stock[3]
            name = stockDict[stock[0]]
            print name, "\t\t", price, "\t", stock[2]
        print "\n"
        
        # THIS IS THE PROBLEM SET I NEED HELP WITH:
        # accumulate total investment by ticker symbol
        byTicker = {}
        # create dict
        for stock in purchases:
            ticker = stock[0]
            price = stock[1] * stock[3]
            if ticker in byTicker:
                byTicker[ticker] += price
            else:
                byTicker[ticker] = price
        
        for ticker, price in byTicker.iteritems():
            print ticker, price
        

        我得到的输出是:

        Company                 Price   Date
        
        General Motors          4800    10-sep-2001
        Caterpillar             2400    01-apr-1999
        Facebook                11200   01-jul-2013
        Caterpillar             10600   02-may-1999
        
        
        GM 4800
        FB 11200
        CAT 13000
        

        这似乎是正确的。

        测试代码是否在byTicker 字典中会告诉您是否已经记录了该股票的购买记录。如果有,你只需添加它,如果没有,你重新开始。这基本上就是您正在做的事情,除了出于某种原因您在该字典中收集给定股票的所有购买记录时,您真正关心的是购买价格。

        您可以按照最初的方式构建 dict,然后遍历存储在每个键下的项目,并将它们相加。像这样的:

        totals = []
        for ticker in byTicker:
            total = 0
            for purchase in byTicker[ticker]:
                total += purchase[1] * purchase[3]
            totals.append((ticker, total))
        
        for ticker, total in totals:
            print ticker, total
        

        只是为了好玩,你可以用生成器语句将它全部压缩成一行:

         print "\n".join("%s: %d" % (ticker, sum(purchase[1]*purchase[3] for purchase in byTicker[ticker])) for ticker in byTicker)
        

        不过,最后两个中的任何一个都完全没有必要这样做,因为您已经在遍历每一次购买,您也可以随时累积每只股票的总价格,正如我在第一个示例中所展示的那样。

        【讨论】:

          猜你喜欢
          • 2017-08-23
          • 2017-01-18
          • 2015-11-14
          • 2020-03-16
          • 2017-04-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多