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 :

Rassembler les éléments d'une liste


Sujet :

Python

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2014
    Messages : 10
    Par défaut Rassembler les éléments d'une liste
    Bonjour,

    Etant nouveau sur Python, je me tourne vers vous pour vous expliquer mon problème. Je désire rassembler certains éléments d'une liste a partir d'un fichier TXT. La structure de mon fichier est la suivante:

    L;article;qte;longueur

    donc par exemple

    L;EG25D;23;500;L;EG25D;17;500;L;EG25D;23;510;L;DPC50;17;500

    Je souhaite ré-écrire le fichier en fusionnant les lignes "L" dont la référence article et la longueur son identique, par rapport à mon exemple retrouver le résultat suivant :

    L;EG25D;40;500;L;EG25D;23;510;L;DPC50;17;500

    Dans mon exemple les deux premières lignes ont été fusionnées du faite que l'article et la longueur sont identiques et les quantités ont été additionnées. Je but sur le fait de chercher les éléments identiques et de les fusionner.

    Comptant sur votre aide

    Merci

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 762
    Par défaut
    Salut,

    Citation Envoyé par prev639367 Voir le message
    Comptant sur votre aide
    Il faut découper la chaine suivant les ";" puis regrouper les éléments par paquets de 4:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    >>> s = "L;EG25D;23;500;L;EG25D;17;500;L;EG25D;23;510;L;DPC50;17;500"
    >>> s.split()
    ['L;EG25D;23;500;L;EG25D;17;500;L;EG25D;23;510;L;DPC50;17;500']
    >>> s.split(';')
    ['L', 'EG25D', '23', '500', 'L', 'EG25D', '17', '500', 'L', 'EG25D', '23', '510'
    , 'L', 'DPC50', '17', '500']
    >>> L = s.split(';')
    >>> for x in range(0, len(L), 4):
    ...     print(L[x:x+4])
    ...
    ['L', 'EG25D', '23', '500']
    ['L', 'EG25D', '17', '500']
    ['L', 'EG25D', '23', '510']
    ['L', 'DPC50', '17', '500']
    Puis on va sommer la 2ème colonne de ceux qui ont la même clé composite (article;longueur):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    >>> from collections import defaultdict
    >>> dd = defaultdict(int)
    >>> for x in range(0, len(L), 4):
    ...     key = L[x+1], L[x+3]
    ...     dd[key] += int(L[x+2])
    ...
    >>> from pprint import pprint
    >>> pprint(dd)
    {('DPC50', '500'): 17,
     ('EG25D', '500'): 40,
     ('EG25D', '510'): 23}
    >>>
    Reste à remettre cela sous forme de chaine de caractères.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2014
    Messages : 10
    Par défaut
    Merci, j'essaye ça ce week-end et vous poste le retour

    Bonne soirée

  4. #4
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2014
    Messages : 10
    Par défaut
    Bonjour et merci à toi wiztricks, cela fonctionne parfaitement bien, mais j'ai encore une question, comment récupérer les élément créés ?

    J'ai essayé

    Mais je ne récupère que les valeurs de quantité.

    Une idée ?

    D'avance merci

  5. #5
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

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

    Informations forums :
    Inscription : Janvier 2010
    Messages : 553
    Par défaut
    Salut,

    comme son nom l'indique plutôt bien, la méthode values() que tu appelles sur le dictionnaire ne renvoie que les valeurs. si tu veux récupérer les clefs avec, il faut utiliser la méthode items() et boucler dessus.

    un truc de ce genre devrait fonctionner:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for key, value, in dd.items():
        print("L;{k[0]};{v};{k[1]}".format(k=key, v=value))
    ou alors:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for (ref, len_), value, in dd.items():
        print("L;{};{};{}".format(ref, value, len_))
    (avec une légère préférence personnelle pour la deuxième possibilité.)

  6. #6
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2014
    Messages : 10
    Par défaut
    Merci beaucoup de ta réponse Tryph.

    Je teste

    Merci encore

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2014
    Messages : 10
    Par défaut
    Bon tout fonctionne sauf sur certains fichiers ou je me prend un out of range à la ligne 96.

    Une idée ?

    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    # -*-coding:Latin-1 -*
    import os, glob
    os.chdir("c:/dossier_test")
    from tkinter import *
    from tkinter.filedialog import *
    from collections import defaultdict
    from pprint import pprint
     
    #-----------------------------------SPLIT FILES-----------------------------
     
     
     
    #IMPORT FICHIER
    donnees = askopenfilename(title="Ouvrir un fichier")
    donnees_importees = open(donnees,"r")
    contenu = donnees_importees.read()
     
     
     
    #TRAITEMENT DES DONNEES
    contenu = contenu.replace("\n",";")
    ld = contenu.split("E;")
     
    #INCREMENT POUR CONNAITRE LE NOMBRE D'OBJET DANS LA LISTE 
    i=1
     
    #NOMBRE D'OBJET
    x=len(ld)
     
    #CREATION DES FICHIERS
    while i < len(ld):
    	fichier = open("c:/dossier_test/split_{}.txt".format(i),"w")
    	fichier.write(ld[i])
    	i+=1
     
     
    fichier.close()
     
    #-------------------------------FIN SPLIT FILES-----------------------------
     
     
    #-----------------------------------Regroupement de lignes commandes-----------------------------
     
     
     
    #IMPORT FICHIER
    for filename in glob.glob("*.txt"):
    	fichierin = open(filename,"r")
    	resultfilename = os.path.splitext(filename)[0]+'-regroupe.txt'
    	contenu = fichierin.read()
     
     
     
     
    #TRAITEMENT DES DONNEES
    	L=contenu.split(";")
    	fichier = open(resultfilename,"w")
     
    #ECRITUE DE LA LIGNE D'ENTETE
    	fichier.write("E;{};{};{};{};{}\n".format(L[0],L[1],L[2],L[3],L[4],))
    	fichier.close()
     
     
    #SUPPRESSION DE LIGNE D'ENTETE ET SUPPRESSION DES REF COMMANDES
    	del L[0:5]
    	i=1
    	a=4
    	b=5
    	c=6
    	d=7
    	z=len(L)
    	while i<z:
    		del L[a:d]
    		a+=4
    		b+=4
    		c+=4
    		d+=4
    		i+=1
    		z=len(L)
     
     
    #REGROUPEMENT LIGNE
    	for x in range(0, len(L), 4):
    		print(L[x:x+4])
     
    #SUPPRESSION DE LA CLE FINAL
     
    	#fin=len(L)
    	#del L[fin-1]
    	L.remove("")
     
    #REGROUPEMENT QTE
     
    	dd = defaultdict(int)
    	for x in range(0, len(L), 4):
    		key = L[x+1], L[x+3]
    		dd[key] += int(L[x+2])
     
    	pprint(dd)
     
    #Ecriture du fichier
    	fichier = open(resultfilename,"a")
    	for (ref, len_), value, in dd.items():
    		fichier.write("L;{};{};{};;;\n".format(ref, value, len_))
     
    	fichier.close()
     
    #------------------------------Regroupement de lignes commandes-----------------------------
    Soyez indulgent pour le code, je débute

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/11/2007, 16h46
  2. Réponses: 1
    Dernier message: 21/04/2007, 16h36
  3. Réponses: 12
    Dernier message: 04/03/2007, 11h43
  4. Tri aléatoire parmis les éléments d'une liste
    Par ahouba dans le forum Access
    Réponses: 2
    Dernier message: 29/06/2006, 18h03
  5. Réponses: 3
    Dernier message: 15/05/2006, 16h09

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