IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Trouver une somme via une liste de chiffres


Sujet :

Python

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 114
    Par défaut Trouver une somme via une liste de chiffres
    Bonjour bonjour,

    Voilà je viens un peu vous embêtez sur un petit problème : comment trouver une somme(un chiffre) via une liste de chiffre ?

    par exemple :

    Ma somme est de 50 (déjà prédéfini) et j'ai une liste de 10 chiffres [1,9,7,15,99,32,41,17,87,100].
    J'aimerai savoir si ma somme peut-être trouvé en additionnant 2 chiffres de la liste des 10 chiffres.

    J'ai testé un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for i in range(len(list_chiffre)):
         for n in range(len(list_chiffre)):
              LaSomme = list_chiffre[i] + list_chiffre[n]
              if LaSomme == Somme:
                   print "La somme à été trouvé"
    break
    Voilà sauf que si il y a beaucoup de chiffre dans la liste... Ca met du temps ! Donc y aurait-il meilleur méthode ?

    Merci à vous

  2. #2
    Membre émérite
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Par défaut
    Citation Envoyé par Guignon Voir le message
    Bonjour bonjour,

    Voilà je viens un peu vous embêtez sur un petit problème : comment trouver une somme(un chiffre) via une liste de chiffre ?

    par exemple :

    Ma somme est de 50 (déjà prédéfini) et j'ai une liste de 10 chiffres [1,9,7,15,99,32,41,17,87,100].
    J'aimerai savoir si ma somme peut-être trouvé en additionnant 2 chiffres de la liste des 10 chiffres.

    J'ai testé un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for i in range(len(list_chiffre)):
         for n in range(len(list_chiffre)):
              LaSomme = list_chiffre[i] + list_chiffre[n]
              if LaSomme == Somme:
                   print "La somme à été trouvé"
    break
    Voilà sauf que si il y a beaucoup de chiffre dans la liste... Ca met du temps ! Donc y aurait-il meilleur méthode ?

    Merci à vous
    Coucou,
    Heu:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SOMME = 50
    for base in list_chiffre:
        if (SOMME - base) in list_chiffre:
            print(base, (SOMME - base))
            break
    Non?

    Clodion

    PS: et pour la liste des combinaisons:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SOMME = 50
    k = [[x, SOMME - x] for x in list_chiffre if SOMME - x in list_chiffre]
    print(*k, sep = "\n")

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 114
    Par défaut
    Ca m'a l'air cool, Je test ça prochainement

    Merci !

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    Pour accélérer le calcul, tu peux convertir list_chiffre en un set (ensemble); l'opération in sera beaucoup plus rapide:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    s = set(list_chiffre)
    print any(SOMME-x in s for x in s)

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 114
    Par défaut
    Bonjour bonjour,

    Revenons à nos moutons!

    Ah oui set accélère considérablement le temps de calcul ! Magnifique
    Mais en faite je n'ai pas trop compris ce que faisait ceci (j'ai mis ce que j'ai fais):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    s = set(Liste_Variente_AllData)
    k = [[x, SOMME - x] for x in s if SOMME - x in s]
    Je cherche à trouver, pour une SOMME, 2 "x" qui, additionné, correspondrait à la SOMME. Si vous voyez ce que je veux dire !

    Car lorsque je print k, les résultats ne se suivent pas et ne correspondent pas.

    Merci bien

    Edit: ou si vous avez une idée d'une méthode qui vous passerai par la tête

    Re edit : Du coup j'ai fait un truc comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    SOMME = int(LaVarience_J)
    s = set(Liste_Variente_AllData)
    k = [[x, SOMME - x] for x in s if SOMME - x in s]
    Liste_Possibilite = []
    for Nx in range(len(k)):
         Le_Nx = k[Nx][0]
         La_Somme_Moins_X = k[Nx][1]
     
         for search_x2 in range(len(k)) :
              if k[search_x2][0] == La_Somme_Moins_X:
                   #Index_x = k.index(Le_Nx)
                   La_Second_Valeur = k[search_x2][0]
                   #print La_Second_Valeur
                   Data = [SOMME, Le_Nx, La_Second_Valeur]
                   Liste_Possibilite.append(Data)

  6. #6
    Membre émérite
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Par défaut
    Citation Envoyé par Guignon Voir le message

    Mais en faite je n'ai pas trop compris ce que faisait ceci (j'ai mis ce que j'ai fais):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    s = set(Liste_Variente_AllData)
    k = [[x, SOMME - x] for x in s if SOMME - x in s]
    Car lorsque je print k, les résultats ne se suivent pas et ne correspondent pas.
    Bonjour,
    La fonction set transforme la liste en … ensemble (set).
    C'est à dire, un ensemble de valeurs non ordonnées et non redondantes.
    Pour bien comprendre… Il suffit de faire quelques essais dans le shell Python! :-)

    Chez moi, selon les contraintes que j'ai compris au premier message, cela fonctionne parfaitement.
    Par contre, les données ne peuvent pas être ordonnées (puisqu'elles sont obtenues à partir d'un ensemble).

    Ce que fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    k = [[x, SOMME - x] for x in s if SOMME - x in s]
    -"for x in s": x prends tour à tour chacune des valeurs de s (mais il n'y a pas d'ordre)
    -"if SOMME - x in s": à condition que la valeur "SOMME - x" soit présente dans s
    -alors on ajoute la liste [x, SOMME - x] à la liste k

    Heu, sinon,
    Citation Envoyé par Guignon Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    SOMME = int(LaVarience_J)
    s = set(Liste_Variente_AllData)
    k = [[x, SOMME - x] for x in s if SOMME - x in s]
    Liste_Possibilite = []
    for Nx in range(len(k)):
         Le_Nx = k[Nx][0]
         La_Somme_Moins_X = k[Nx][1]
     
         for search_x2 in range(len(k)) :
              if k[search_x2][0] == La_Somme_Moins_X:
                   #Index_x = k.index(Le_Nx)
                   La_Second_Valeur = k[search_x2][0]
                   #print La_Second_Valeur
                   Data = [SOMME, Le_Nx, La_Second_Valeur]
                   Liste_Possibilite.append(Data)
    que donne ma première proposition?
    Avez-vous essayer de trier k tout simplement?
    Clodion

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 114
    Par défaut
    Merci beaucoup pour toute ces informations !

    Okay je viens de testé votre démarche, elle fonctionne de même et à l'air un peu plus rapide.
    Je voulais aussi savoir, si il y avait plus de 2 possibilités comment est ce que vous verrez le problème ? Faire comme pour votre première proposition mais en plusieurs fois ?

    Merci encore

  8. #8
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2011
    Messages : 180
    Par défaut
    Bonjour

    Si la liste est très longue, ne comporte que des nombres positifs et beaucoup de valeurs supérieures à la somme à atteindre. Tu peux
    gagner un peu de temps en la réduisant au nombres inférieurs ou égaux à celle-ci. Mais le gain est négligeable par rapport au set.

  9. #9
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    je propose :
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> import itertools
    >>> l = [1,9,7,15,99,32,41,17,87,100]
    >>> filter (lambda (x,y): x+y == 50, itertools.combinations(l,2))
    [(9, 41)]

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 114
    Par défaut
    Bonjour,

    Merci pour la réponse BufferBob elle fonctionne de même. Seulement ce n'est pas sous forme de liste donc plus compliqué pour récupérer les résultats.

    Sinon est ce que quelqu'un aurait une idée sur une méthode pour récupérer plus de 2 résultats (n résultats) ?

    Merci bien

  11. #11
    Membre émérite
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Par défaut
    Citation Envoyé par Guignon Voir le message
    Sinon est ce que quelqu'un aurait une idée sur une méthode pour récupérer plus de 2 résultats (n résultats) ?
    Bonjour,
    Oui… Il suffit d'étendre ce qui a été fait. C'est à dire de faire la somme de deux termes et vérifier si le troisième est dans la liste ou non…
    C'est assez trivial…

    Non?

    Clodion

  12. #12
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    J'aime bien la solution de BufferBob, mais son utilisation de lambda est refusé par mon Python 3.4 (erreur de syntaxe). mais on peut le modifier comme ça: lambda z: sum(z) == 50

    De plus, pour trouver la liste de tous les couples, il faut 2 choses:
    - il faut que la liste des nb donnée le permette! Le + simple pour l'exemple est d'ajouter, par exemple, 35 (qui va se combiner avec 15).
    - se rappeler que filter est un itérateur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    L = [1, 9, 7, 15, 99, 32, 41, 17, 87, 100, 35]
    R = list(filter(lambda z: sum(z) == 50, itertools.combinations(L, 2)))
    print(R)
    [(9, 41), (15, 35)]

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 114
    Par défaut
    Re

    Oui Clodion et bien c'est ce que j'ai pensé aussi Mais il doit y avoir mieux. Sinon il faut étendre le résultat à un nombre défini (n = 5 donc 5 boucle)

    A oui tyrtamos ça peut-être pas mal comme ça (Pour avoir 3 données) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    L = [1, 9, 7, 15, 99, 32, 41, 17, 87, 100, 35, 5,10]
    R = filter(lambda z: sum(z) == 50, itertools.combinations(L, 3))
    print(R)
    [(1, 32, 17), (35, 5,10)]
    Vais voir si ça peut coller

    Merci

    Edit : ça cooooolle ! Merci c'est résolu !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [SP-2010] Faire une somme sur une colonne d'une liste
    Par sebfreu dans le forum SharePoint
    Réponses: 6
    Dernier message: 19/01/2012, 11h05
  2. [AC-2003] Lier les tables d'une Base1 dans une Base3 via une Base2
    Par ted the Ors dans le forum VBA Access
    Réponses: 0
    Dernier message: 30/12/2009, 11h58
  3. Réponses: 14
    Dernier message: 10/09/2009, 19h08
  4. [CR X]Effectuer une somme d'une somme
    Par Chuppas dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 06/08/2008, 10h52
  5. Réponses: 2
    Dernier message: 17/04/2007, 17h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo