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 :

Opération dans une liste.


Sujet :

Python

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 20
    Par défaut Opération dans une liste.
    Bonjour.

    Je cherche une solution qui me permettra de faire des regroupements... Je m'explique.

    J'ai 2 listes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    lidate=['1', '1', '5 ', '6', '6', '8'] 
    lipart=['2', '1', '1', '20', '5', '5']
    Ce que je cherche à faire c'est 2 autres listes ; lidate2 qui supprime les doublons de lidate et lipart2 qui additionne les valeurs de lipart pour les doublons de lidate

    Ce qui me donnerai ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    lidate2=['1','5','6','8']
    lipart2=['3','1','25','5']
    Supprimer les doublons, j'ai trouvé comment faire, mais je n'arrive pas à faire ma 2nde liste...
    Une idée ?

    Merci

  2. #2
    Membre Expert Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Par défaut
    Salut,

    J'ai du mal a saisir la creation de lipart2 ?

  3. #3
    Membre émérite

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Par défaut
    Personnellement ce que j'ai du mal à saisir est l'utilisation de deux listes
    Pourquoi ne pas les fusionner en un dictionnaire puis écrire un petit code qui crée un nouveau dico sans "doublons" (si la clé est déjà utilisée, on fait la somme, sinon on rajoute la clé)
    Après il ne restera plus qu'à le retransformer en liste(s)

  4. #4
    Membre émérite
    Avatar de GnuVince
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2004
    Messages
    679
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2004
    Messages : 679
    Par défaut
    Utilise des set() pour les doublons:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    >>> l = [1,1,1,2,2,3]
    >>> l
    [1, 1, 1, 2, 2, 3]
    >>> s = set(l)
    >>> s
    set([1, 2, 3])
    >>>
    Pour le reste, je comprends pas PANTOUTE ce que tu veux faire. Sois plus clair.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 20
    Par défaut
    En fait c'est des données venant d'un tableau html.
    Chaque liste correspond à une colonne du tableau date et part.
    Ca marche comme ça par exemple :

    Le 1/10 > 2parts ont été utilisé
    Le 1/10 > 1 part a été utilisé
    Le 5/10 > 1 part a été utilisé
    Le 6/10 > 20 parts ont été utilisé
    Le 6/10 > 5 parts ont été utilisé
    Le 8/10 > 5 parts ont été utilisé

    Le but de ce que je veux faire c'est écrire ces données dans un fichier (cvs par exemple), en regroupant les parts utilisées le même jour, pour me donner un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    "1/10";"3 parts"
    "5/10";"1 part"
    "6/10";"25 parts"
    "8/10";"5 parts"
    C'est plus clair ?

    J'ai donc pensé à faire une nouvelle liste avec les dates unique et une avec la sommes des parts ensuite les recopier simplement dans un fichier.
    Je prends le problème par le mauvais bout peut-être...

  6. #6
    Membre émérite

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Par défaut
    Il vaut donc mieux utiliser un dictionnaire, beaucoup plus efficace.
    Une clé par date, et tu incrémentes la valeur à chaque occurrence de la même date
    Le code, à toi de le trouver, c'est pas difficile

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 20
    Par défaut
    Je n'avais jamais travaillé avec des dictionnaires, et j'avais d'ailleurs du mal à comprendre à quoi ça servait.
    Maintenant je comprends un peu mieux et c'est vrai que c'est très efficace.
    Voilà ce que j'ai fait et qui fonctionne
    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
    #!/usr/bin/env python
    # -*- coding: iso-8859-1 -*-
     
    import re, urllib
     
    htmlSource = urllib.urlopen("http://").read()
    listedate= re.findall('<td class="date">(.*?)ago</td>',htmlSource)
    listeparts= re.findall('<td class="parts">(.*?)</td>',htmlSource)
     
    tableau={}
     
    for i in range(len(listedate)):
     
        if tableau.has_key(listedate[i]):
     
            tableau[listedate[i]]=int(tableau[listedate[i]])+int(listeparts[i])
            tableau[listedate[i]]=str(tableau[listedate[i]])            
     
        else:
            tableau[listedate[i]]=listeparts[i]
     
    obFichier = open('d:\Monfichier.csv','w')
     
    for cle in tableau:
        obFichier.write(cle)
        obFichier.write(";")
        obFichier.write(tableau[cle])
        obFichier.write("\n")
     
     
    obFichier.close()
    S'il y a moyen de réduire je suis quand même preneur :p.

    Merci oiffrig

  8. #8
    Membre émérite

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Par défaut
    Tu peux utiliser les fonctions itératives et les chaînes de formatage pour aller plus vite, de plus c'est inutile de reconvertir à chaque fois en entier puis à nouveau en chaîne de caractères
    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
    #!/usr/bin/env python
    # -*- coding: iso-8859-1 -*-
     
    import re, urllib
     
    htmlSource = urllib.urlopen("http://").read()
    tableau={}
     
    for match in re.finditer('<td class="date">(\\d+?)ago</td>.*?<td class="parts">(\\d+?)</td>',htmlSource): #à voir si c'est possible dans ton cas, normalement ça ne devrait pas poser problème
        date, parts = match.group(1, 2)
        if tableau.has_key(date):
            tableau[date] += int(parts)
        else:
            tableau[date] = int(parts)
     
    obFichier = open('d:\Monfichier.csv','w')
     
    for item in tableau.iteritems():
        obFichier.write("%s;%i\n" % item)
     
    obFichier.close()

  9. #9
    Membre expérimenté
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    181
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 181
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        if tableau.has_key(date):
            tableau[date] += int(parts)
        else:
            tableau[date] = parts
    Attention, tu as oublié la conversion en entier dans le else.
    Mais ces 4 lignes peuvent être simplifiées grâce à la méthode get :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tableau[date] = tableau.get(date, 0) + int(parts)
    Et je suppose qu'il fallait lire match.group au lieu de m.group

  10. #10
    Membre émérite

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Par défaut
    En effet, voilà ce qui arrive quand on ne relit pas son code
    Pour get j'ai hésité à l'utiliser, mais je me suis dit que le code serait plus clair sans.

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 20
    Par défaut
    Ok merci à vous deux. Je vais aller voir ce que c'est que cette méthode get quand même

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

Discussions similaires

  1. [LG]Tri par insertion dans une liste chainée
    Par mister_dsg dans le forum Langage
    Réponses: 4
    Dernier message: 18/12/2003, 22h34
  2. [LG]suppression dans une liste chainée
    Par mister_dsg dans le forum Langage
    Réponses: 9
    Dernier message: 16/12/2003, 21h20
  3. [langage] Comment rajouter des champs dans une liste
    Par toto_titi dans le forum Langage
    Réponses: 4
    Dernier message: 28/08/2003, 14h09
  4. Réponses: 2
    Dernier message: 17/08/2003, 20h07
  5. Réponses: 4
    Dernier message: 24/04/2003, 22h28

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