如何高效遍历字典?

2024-06-16 10:49:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我是Python和编程新手。在

我的课本上说我必须做以下习题:

Create a second purchase summary that which accumulates total investment by ticker symbol. In the above sample data, there are two blocks of CAT.

These can easily be combined by creating a dict where the key is the ticker and the value is the list of blocks purchased. The program makes one pass through the data to create the dict. A pass through the dict can then create a report showing each ticker symbol and all blocks of stock.

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

## 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

现在,输出是:

^{pr2}$

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


Tags: oftheinbycreatestocksymbolprice
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

我得到的输出是:

^{pr2}$

这似乎是正确的。在

测试股票代码是否在byTickerdict中,可以告诉您是否已经记录了该股票的购买记录。如果有的话,你就加进去,如果没有,你就重新开始。这基本上就是你在做的,除了出于某种原因你收集了那张dict中给定股票的所有购买记录,当时你真正关心的只是购买的价格。在

您可以按照原来的方式构建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

对于kicks,您可以使用generator语句将其压缩为一行:

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

不过,后两种方法中的任何一种都是完全不需要做的,因为您已经在遍历每一次购买,所以您也可以像我在第一个示例中所展示的那样,累积每只股票的总价格。在

代码的问题在于,您没有迭代purchaes,而只是从每个ticker值中获取第一个元素。也就是说,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)]
}

所以当你迭代这些值时,你实际上得到了三个列表。但当您处理这些列表时,实际上您只访问其中的第一个列表:

^{pr2}$

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

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

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

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

这里的股票只供你使用。相反,请尝试:

^{pr2}$

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

CAT 13000
FB 11200
GM 4800

相关问题 更多 >