<p>也许是这样的:</p>
<pre><code>## 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
</code></pre>
<p>我得到的输出是:</p>
^{pr2}$
<p>这似乎是正确的。在</p>
<p>测试股票代码是否在<code>byTicker</code>dict中,可以告诉您是否已经记录了该股票的购买记录。如果有的话,你就加进去,如果没有,你就重新开始。这基本上就是你在做的,除了出于某种原因你收集了那张dict中给定股票的所有购买记录,当时你真正关心的只是购买的价格。在</p>
<p>您可以按照原来的方式构建dict,然后迭代存储在每个键下的项,并将它们相加。像这样:</p>
<pre><code>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
</code></pre>
<p>对于kicks,您可以使用generator语句将其压缩为一行:</p>
<pre><code> print "\n".join("%s: %d" % (ticker, sum(purchase[1]*purchase[3] for purchase in byTicker[ticker])) for ticker in byTicker)
</code></pre>
<p>不过,后两种方法中的任何一种都是完全不需要做的,因为您已经在遍历每一次购买,所以您也可以像我在第一个示例中所展示的那样,累积每只股票的总价格。在</p>