Problème simple ici. Je n'arrive pas à comprendre comment le résoudre.

Fondamentalement, j'ai un dictionnaire avec plusieurs tuples dans les données de stock de ce magasin.

Ex.

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)]

Et j'essaye de le déballer et de multiplier le prix d'achat par le nombre d'actions. Finalement, les ajouter ensemble par la suite.

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

Cependant, je reçois une ValueError: besoin de plus de 4 valeurs pour décompresser.

Est-ce parce que les chaînes ne sont pas des entiers?

Toute aide serait appréciée. Merci

1
Saigo no Akuma 7 mars 2016 à 21:35

4 réponses

Meilleure réponse

portfolio est une liste contenant 4 tuples. Cette ligne de code:

purdate, purprice, numshares, sym, curprice = portfolio

Tente de décompresser cette liste en 5 variables, ce qui échoue car il ne contient que quatre éléments. Je soupçonne que vous voulez coder quelque chose comme:

# 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
2
bgporter 7 mars 2016 à 18:44

Merci à @bgporter et @ F1Rumors !!

Ma réponse à ceci:

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

Je pourrais probablement le réduire en utilisant la suggestion de @ F1Rumors, mais cela suffira pour l'instant!

0
Saigo no Akuma 7 mars 2016 à 18:57

La réponse de bgporter est bonne, et probablement ce que vous recherchez. Votre intention initiale de déballer les tuples dans vos propres tableaux est également réalisable:

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

Notez que le zip (* portfolio) décompresse essentiellement les colonnes du portfolio et la plage (len (portfolio)) dans la boucle for pour obtenir la longueur correcte. Résultats:

1087.5
2140.0
3157.5
3758.0

Je préfère toujours @bgporter pour la simplicité et la lisibilité, mais cette approche est réalisable.

Pour une réponse modèle, je ferais ceci:

def total_purchase_price(portfolio):
    def px(row):
        purdate, purprice, numshares, sym, curprice = row
        return purprice * numshares
    print sum(map(px, portfolio))
1
F1Rumors 10 mars 2016 à 14:36

Si vous voulez la somme, vous pouvez utiliser la fonction sum décompactant dans la boucle:

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

Ou en utilisant python3 avec décompression itérable étendue :

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

Ou si vous aimez la fonctionnalité, vous pouvez utiliser certaines méthodes d'opérateur avec {{X0} }:

from operator import mul, itemgetter
from itertools import starmap


def total_purchase_price(portfolio):
    return sum(starmap(mul, map(itemgetter(1,2), portfolio)))
1
Padraic Cunningham 7 mars 2016 à 19:00