Partage
  • Partager sur Facebook
  • Partager sur Twitter

Multiplier deux listes terme à terme

Sujet résolu
    16 février 2016 à 22:16:55

    Bonjour, j'aurais besoin de votre aide svp. On a deux listes a et b qui ont le même nombre d'éléments. La première liste indique un nombre d'objets, la seconde liste indique le prix unitaire respectif de chaque objet. On doit trouver la dépense totale. 

    J'ai réussi à le faire sur un exemple concret. Mais, comme d'habitude, je coince au moment de faire le cas général en utilisant une fonction. Voici mon script, merci pour votre aide.

    a = [1,2,3, 4, 5]
    b = [6,7,8,9,10]
    sum = 0
    for i in range(len(a)):
        c = a[i]*b[i]
        sum+=c
    print (sum)
    
    130 



    • Partager sur Facebook
    • Partager sur Twitter
      16 février 2016 à 22:46:02

      Ben tu met juste un def et au lieu du print tu met un return quoi^^

      Sinon, on pourrait aussi utiliser zip:

      def produit(L1, L2):
          L3 = []
          for elt1, elt2 in zip(L1, L2):
              L3.append(elt1*elt2)
          return L3
      
      #ou bien:
      produit = lambda L1, L2: [elt1*elt2 for elt1, elt2 in zip(L1, L2)]

      Edit: je ne sais pas si c'est pour un exercice ou bien pour un projet personnel, mais un dictionnaire me parait plus indiqué^^ (c'est même l'exemple typique d'utilisation d'un dictionnaire)

      -
      Edité par Derzal 16 février 2016 à 22:48:13

      • Partager sur Facebook
      • Partager sur Twitter
        16 février 2016 à 22:47:40

        Je n'ai pas bien compris : tu cherches juste à multiplier les termes deux par deux, ou tu cherches à calculer la somme de ces multiplications ?

        La solution la plus élégante en Python se ferait à l'aide de zip et d'une liste / un générateur en intension.

        >>> u = [1, 2, 3, 4, 5]
        >>> v = [6, 7, 8, 9, 10]
        >>> [a * b for (a, b) in zip(u, v)] # multiplications terme à terme
        [6, 14, 24, 36, 50]
        >>> sum(a * b for (a, b) in zip(u, v)) # somme
        130
        

        Pour en faire une fonction, il suffit de lui faire prendre les deux listes en paramètre, et de retourner la valeur souhaitée.

        def dot_product(u, v):
            return sum(a * b for (a, b) in zip(u, v))
        
        • Partager sur Facebook
        • Partager sur Twitter
          17 février 2016 à 0:21:01

          Merci beaucoup  Derzal et entwanne. Il s'agit en effet d'un exercice puisque je suis en train d'apprendre les listes. Grâce à vous, j'ai pu arriver à écrire un script convenable.:D

          • Partager sur Facebook
          • Partager sur Twitter
            17 février 2016 à 0:22:01

            Je me suis amusé ;):

            from operator import mul
            f = lambda lst1, lst2: sum(map(mul, lst1, lst2))
            
            print(f([1, 2, 3, 4, 5], [6, 7, 8, 9, 10]))


            PS: Par contre j'ai l'impression que tu n'as pas compris comment faire des fonctions. Aussi je te conseille vraiment de passer du temps à comprendre ce concept, qui est somme toute assez simple et pourtant fondamental. Notamment comprendre l'utilisation des paramètres et du return. La première fonction de Derzal fera très bien l'affaire pour t'aider dans cette compréhension (les autres tu peux les zapper pour l'instant).

            • Partager sur Facebook
            • Partager sur Twitter
            Précepte: Le mieux est l'ennemi du bien
              17 février 2016 à 10:50:54

              Une autre façon de voir ça c’est que c’est un pliage sur une opération multiply-accumulate. Bon clairement ça ne rend pas le code meilleur. :lol:

              from functools import reduce
              f = lambda L1, L2: reduce(lambda s, z: s + z[0]*z[1], zip(L1, L2), 0)
              
              print(f([1, 2, 3, 4, 5], [6, 7, 8, 9, 10]))
              

              -
              Edité par talpa 17 février 2016 à 10:52:28

              • Partager sur Facebook
              • Partager sur Twitter
              per aspera ad astra – comp.lang.c FAQexplication pointeur
                17 février 2016 à 20:51:56

                Je vous remercie, chers Olygrim et talpa. Je dois admettre que, pour l'instant, je ne comprends rien à vos deux suggestions car je n'ai jamais entendu parler de "lambda, map, mul, reduce, functools...". J'espère bien qu'un prochain jour, ce sera pour moi clair comme de l'eau de roche; je reviendrai alors avec plaisir sur ce post pour mesurer mes progrès en Python... Encore merci et à bientôt.:euh:
                • Partager sur Facebook
                • Partager sur Twitter

                Multiplier deux listes terme à terme

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown