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 :

sommer les elements d'une liste


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 202
    Par défaut sommer les elements d'une liste
    Bonjour

    je voudrai sommer les elements correspondant au même nom dans la liste suivante

    [(<Material: BN55>, 2.9529087167976291), (<Material: BN55>, 0.925711193568296
    23), (<Material: FG77>, 3.1211045110192654), (<Material: FG77>, 3.25548782768039
    ), (<Material: Al2O3>, 1.1663297283404019), (<Material: Al2O3>, 1.36212370263133
    82)]

    c'est a dire par exemple pour BN55 sommer 2.9529 et 0.927

    me retrouver finalement avec la liste

    [(<Material: BN55>, 3.8786199103659253), (<Material: FG77>, 6.3765923386996555),(<Material: Al2O3>, 2.5284534309717399)]

  2. #2
    Membre émérite

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 662
    Par défaut
    Bonjour Pat100.

    Cette tâche ne peut-elle pas être directement réalisée lors de la construction de ta liste?

    http://www.developpez.net/forums/d13...s/#post7214864


    Hors sujet:

    Si je comprends bien tu as une liste de matériaux associés à une valeur (surface je crois). Je ne sais pas ce que tu comptes faire de cette liste par la suite, mais j'ai comme l'impression qu'un dictionnaire serait plus adapté.


    Ju

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 202
    Par défaut
    j'ai trouvé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    for mat100 in M4:
            if j !=0:
                XX=[]
                if M4[j-1][0]==M4[j][0]:
                   XX.append(M4[j-1][1])
                   XX.append(M4[j][1])
                   XX= sum(XX)
                   M6.append((M4[jj][0],XX))
            j+=1
            jj+=1

  4. #4
    Membre très actif
    Avatar de afranck64
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 592
    Par défaut Peut-être...
    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
    17
    def process(lst):
        res = dict()
        for key, val in lst:
            #Le second parametre de get est la valeur
            #a retourner au cas ou <key> n'est pas encore
            #contenu dans le dictionnaire
            res[key] = res.get(key, 0) + val
        return res.items()
     
    if __name__ == "__main__":
        testList = [("<Material: BN55>", 2.9529087167976291),
                    ("<Material: BN55>", 0.92571119356829623),
                    ("<Material: FG77>", 3.1211045110192654),
                    ("<Material: FG77>", 3.25548782768039),
                    ("<Material: Al2O3>", 1.1663297283404019),
                    ("<Material: Al2O3>", 1.3621237026313382)]
        print process(testList)
    Win 10 64 bits / Linux Mint 18, - AMD A6 Quad: Py27 / Py35
    CONTENU D'UNE QUESTION
    Exemples:
    - Configuration (système d'exploitation, version de Python et des bibliothèques utilisées)
    - Code source du morceau de programme où il y a un bogue
    - Ligne de code sur laquelle le bogue apparaît
    - Erreur complète retournée pas l'interpréteur Python
    - Recherche déjà effectuée (FAQ, Tutoriels, ...)
    - Tests déjà effectués

  5. #5
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonsoir,

    Adepte de in je trouve cela plus 'lisible' et plus rapide (Bien sur utile si c'est une grosse liste...) par rapport aux méthodes.
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    import random
    import time
     
     
    def process(lst):
        res = dict()
        for key, val in lst:
            res[key] = res.get(key, 0) + val
        return res
     
    def process1(lst):
        res = {}
        for key, val in lst:
            if key in res:
                res[key] += val
            else:
                res[key] = val
        return res
     
     
    v = (2.9529087167976291, 0.92571119356829623, 3.1211045110192654)
    k = ("<Material: BN55>", "<Material: FG77>", "<Material: Al2O3>")
    testList = []
    for kv in range(500000):
        testList.append((k[random.randint(0, 2)], v[random.randint(0, 2)]))
    tps1 = time.clock()
    test1 = process(testList)
    tps2 = time.clock()
    print(tps2 - tps1)
    tps1 = time.clock()
    test2 = process1(testList)
    tps2 = time.clock()
    print(tps2 - tps1)
    print(test1)
    print(test2)
    Sinon bon exemple du get()

    @+

    Sujet du week ?

  6. #6
    Membre très actif
    Avatar de afranck64
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 592
    Par défaut
    @Pausekawa en cherchant la fiche des performances des méthodes de dict, je suis tomber sur des classes intéressantes du module collections.
    D'abord <Counter> théoriquement fait pour cet usage, mais en moyenne 2 fois plus lent que le get. Et puis, <defaultdict> qui a un bien meilleur rendement:
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    import random
    import collections
    import time
     
     
    def process(lst):
        res = dict()
        for key, val in lst:
            res[key] = res.get(key, 0) + val
        return res
     
    def process1(lst):
        res = {}
        for key, val in lst:
            if key in res:
                res[key] += val
            else:
                res[key] = val
        return res
     
    def zero():
        return 0
     
    def process2(lst):
        res = collections.defaultdict(zero)
        for key, val in lst:
            res[key] += val
        return res
     
     
    v = (2.9529087167976291, 0.92571119356829623, 3.1211045110192654)
    k = ("<Material: BN55>", "<Material: FG77>", "<Material: Al2O3>")
    testList = []
    for kv in range(500000):
        testList.append((k[random.randint(0, 2)], v[random.randint(0, 2)]))
    tps1 = time.clock()
    test1 = process(testList)
    tps2 = time.clock()
    print(tps2 - tps1)
    tps1 = time.clock()
    test2 = process1(testList)
    tps2 = time.clock()
    print(tps2 - tps1)
    tps1 = time.clock()
    test3 = process2(testList)
    tps2 = time.clock()
    print(tps2 - tps1)
    print(test1)
    print(test2)
    print(test3)
    Win 10 64 bits / Linux Mint 18, - AMD A6 Quad: Py27 / Py35
    CONTENU D'UNE QUESTION
    Exemples:
    - Configuration (système d'exploitation, version de Python et des bibliothèques utilisées)
    - Code source du morceau de programme où il y a un bogue
    - Ligne de code sur laquelle le bogue apparaît
    - Erreur complète retournée pas l'interpréteur Python
    - Recherche déjà effectuée (FAQ, Tutoriels, ...)
    - Tests déjà effectués

Discussions similaires

  1. Réponses: 3
    Dernier message: 25/01/2007, 08h54
  2. Info Bulle sur les elements d'une liste déroulante
    Par ReaseT dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 03/10/2006, 12h01
  3. [Débutant] Doubler les éléments d'une liste
    Par guillaume07 dans le forum Prolog
    Réponses: 4
    Dernier message: 25/08/2006, 17h21
  4. [CSS] largeur fixe pour les elements d'une liste
    Par arnolpourri dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 24/05/2006, 13h25
  5. Rechercher les element d'une liste dans une autre liste
    Par fessebleu dans le forum Langage
    Réponses: 30
    Dernier message: 24/04/2006, 21h23

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