元组解包 - ValueError

时间:2016-03-07 18:35:38

标签: python python-3.x dictionary tuples

这里的问题很简单。我似乎无法得到如何解决它。

基本上,我在该商店库存数据中有一个包含多个元组的字典。

离。

portfolio = [('25-Jan-2001', 43.5, 25, 'CAT', 92.45),
('25-Jan-2001', 42.8, 50, 'DD', 51.19),
('25-Jan-2001', 42.1, 75, 'EK', 34.87),
('25-Jan-2001', 37.58, 100, 'GM', 37.58)]

我正在尝试打开包装并将购买价格乘以股票数量。最后将它们加在一起。

def total_purchase_price(portfolio):
    purdate, purprice, numshares, sym, curprice = portfolio
    totalprice = 0
    for i in portfolio: 
        totalprice = purprice[i] * numshares[i]
        print(totalprice)
    return

但是,我得到一个ValueError:需要超过4个值来解压缩。

这是因为字符串不是整数吗?

任何帮助将不胜感激。感谢

4 个答案:

答案 0 :(得分:2)

portfolio是一个包含4个元组的列表。这行代码:

purdate, purprice, numshares, sym, curprice = portfolio

尝试将该列表解压缩为5个变量,但由于其中只有四个项目,因此失败。我怀疑你想要代码模式如下:

# iterate through the items in the portfolio
for item in portfolio:
    # for each item, unpack the tuple into its constituent parts
    purdate, purprice, numshares, sym, curprice = item
    # ...do some calculations on those values

答案 1 :(得分:1)

bgporter的反应很好,可能就是你要找的东西。您最初将元组解压缩到自己的数组中的意图也是可以实现的:

def total_purchase_price(portfolio):
    purdate, purprice, numshares, sym, curprice = zip(*portfolio)
    totalprice = 0
    for i in range(len(portfolio)):
        totalprice = purprice[i] * numshares[i]
        print(totalprice)
    return

请注意,zip(* portfolio)基本上解压缩组合列,并在for循环中使用范围(len(portfolio))来获得正确的长度。结果:

1087.5
2140.0
3157.5
3758.0

我仍然更喜欢简单的@bgporter&可读性,但这种方法是可行的。

对于模型答案,我会这样做:

def total_purchase_price(portfolio):
    def px(row):
        purdate, purprice, numshares, sym, curprice = row
        return purprice * numshares
    print sum(map(px, portfolio))

答案 2 :(得分:1)

如果你想要总和,你可以在循环中使用 sum 函数解包:

def total_purchase_price(portfolio):
    return sum(pp * sh for _, pp, sh, _, _ in portfolio)

或者将python3与extended iterable unpacking一起使用:

def total_purchase_price(portfolio):
    return sum(pp * sh for _, pp, sh, *_ in portfolio)

或者,如果您喜欢功能,可以使用itertools.starmap的一些运算符方法:

from operator import mul, itemgetter
from itertools import starmap


def total_purchase_price(portfolio):
    return sum(starmap(mul, map(itemgetter(1,2), portfolio)))

答案 3 :(得分:0)

感谢@bgporter和@ F1Rumors !!

我对此的回答:

def total_purchase_price(portfolio):
    totalprice = 0
    totalpurprice = 0
    for item in portfolio:
        purdate, purprice, numshares, sym, curprice = item
        totalprice += purprice * numshares
        totalpurprice = totalprice
    print(totalpurprice)
    return

我可以使用@ F1Rumors的建议来减少它,但现在这样做了!