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 :

Combinaison d'une liste [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2012
    Messages : 63
    Par défaut Combinaison d'une liste
    Bonjour à tous
    j'ai 8 dossier contenants des fichiers excels, j'ai crée une liste contenant les noms des dossiers
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    liste=['Mn','U','Cs','Am','Na','Co60','Y','Sr']
    j'ai crée une fonction qui retourne toutes les combinaisons possible de 2 , ça donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ['MnU' 'MnCs' 'UCs' 'MnAm' 'UAm' 'CsAm' 'MnNa' 'UNa' 'CsNa' 'AmNa'
     'MnCo60' 'UCo60' 'CsCo60' 'AmCo60' 'NaCo60' 'MnY' 'UY' 'CsY' 'AmY' 'NaY'
     'Co60Y' 'MnSr' 'USr' 'CsSr' 'AmSr' 'NaSr' 'Co60Sr' 'YSr']
    le soucis que j'arrive pas à crée une fonction qui parcoure les dossiers de chaque combinaison .
    au lieux de faire une fonction qui parcoure les deux dossiers en parallèle mais à chaque fois je tapes moi meme
    les paramètres .
    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
    Rn ='./Am/*.xlsx' 
    addrs = glob.glob(Rn)
    Rn1 ='./Co60/*.xlsx'
    addr = glob.glob(Rn1)
     
    file='Am-Co60_60_40'
    f=0.6#pourcentage de x
     
    dirName ='Radionucléide/'+file
    try:
        os.mkdir(dirName)
        print("Directory " , dirName ,  " Created ") 
    except FileExistsError:
        print("Directory " , dirName ,  " already exists")
    for i,j,k in zip(addrs,addr,range(len(addrs))):    
        x=trace_spectre(i)
        #print("S1",np.sum(coups))
        y=trace_spectre(j)
        figure=dirName+'/Am-Co60_'+str(k)+'.png'
        #ax=liste1()
        c=f*x+(1-f)*y
        plt.vlines(x=[i for i in range(0,2200,15)],ymin=0,ymax=c,color='black')
        plt.plot([i for i in range(0,2200,15)],c,'k')
        plt.savefig(figure)
        plt.show()
    la fonction trace_spectre() retourne un colonne du fichier excel.
    le code marche bien , mais je veux automatisé ça , je dois faire 28 combinaison , a près chaque combinaison je dois la faire 4 fois
    par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    0,2*Mn+0,8*cs
    08*Mn+0,2*cs
    04*Mn+0,6*cs
    06*Mn+0,4*cs
    ce qui explique la valeur de la variable c et f

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> def generate(left, right, percent):
    	return "{}-{}_{:d}_{:d}".format(left, right, int(percent * 100), int((1 - percent) * 100))
     
     
    >>> generate('Am', 'C060', 0.6)
     
    'Am-C060_60_40'
    C'est ça que tu cherches à faire ?

  3. #3
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2012
    Messages : 63
    Par défaut
    ça résout un peut le problème , dans ce cas comment je peux accéder aux dossiers Am et Co60 ?
    en fait ç'est ça le problème , je dois parcourir toutes la liste des combinaison , et pour chaque combinaison (Am-Co60) je reçoit l'url des deux dossiers
    après le même travail avec 3 combinaisons.
    je prépare une grande base de données pour mon réseau de neurones CNN.

  4. #4
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Pourquoi stocker vos combinaisons sous la forme d'une chaine de caractère unique que vous devrez redécouper pour accéder à chacun des fichiers ?

    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
    list(itertools.combinations(liste,2))
    [('Mn', 'U'),
     ('Mn', 'Cs'),
     ('Mn', 'Am'),
     ('Mn', 'Na'),
     ('Mn', 'Co60'),
     ('Mn', 'Y'),
     ('Mn', 'Sr'),
     ('U', 'Cs'),
     ('U', 'Am'),
     ('U', 'Na'),
     ('U', 'Co60'),
     ('U', 'Y'),
     ('U', 'Sr'),
     ('Cs', 'Am'),
     ('Cs', 'Na'),
     ('Cs', 'Co60'),
     ('Cs', 'Y'),
     ('Cs', 'Sr'),
     ('Am', 'Na'),
     ('Am', 'Co60'),
     ('Am', 'Y'),
     ('Am', 'Sr'),
     ('Na', 'Co60'),
     ('Na', 'Y'),
     ('Na', 'Sr'),
     ('Co60', 'Y'),
     ('Co60', 'Sr'),
     ('Y', 'Sr')]
    Ici vous avez dans chaque tuple une combinaison. Après si vous avez des pondérations, pourquoi ne pas stocker cela sont forme de nombre (vous avez ainsi directement le f), et ensuite vous le multiplié par 100 et faites un str avec. Ainsi du pourcentage vous déduisez le nom du fichier, et non dans l'autre sens (qui d'ailleurs est bancal, puisque vous avez quand même besoin du pourcentage en plus à côté, car vous ne l'extrayez pas du nom de fichier)

    Avant de vouloir boucler sur plusisuers fichiers, commencez par vous faire une fonction, qui traite seulement d'un couple unique avec des poids donné :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    def TreatOneCombination( files_to_combine, weights ):
        #### files_to_combine : un tuple contenant une combinaisons de nom de fichier
        #### weights : un tuple définissant les poids de la combinaison. Ce tuple doit contenir 2 floattants, dont la somme vaut 1
        file = "%s-%s_%d_%d"%(files_to_combine[0], files_to_combine[1], 100*weights[0], 100*weights[1] )
        print(file)
     
        #### etc

  5. #5
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    J'ai un super ami qui s'apelle Google

    Je lui demande, je prends le premier résultat.

    J'adapte le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    import itertools
     
    folders = ['Am', 'Co60', 'MnU', 'Co60Sr']
     
    for x in itertools.combinations(folders, 2):
        print(x)
     
    for x in itertools.combinations(folders, 3):
        print(x)
    Et j'obtiens :
    ('Am', 'Co60')
    ('Am', 'MnU')
    ('Am', 'Co60Sr')
    ('Co60', 'MnU')
    ('Co60', 'Co60Sr')
    ('MnU', 'Co60Sr')
    ('Am', 'Co60', 'MnU')
    ('Am', 'Co60', 'Co60Sr')
    ('Am', 'MnU', 'Co60Sr')
    ('Co60', 'MnU', 'Co60Sr')

  6. #6
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2012
    Messages : 63
    Par défaut
    Bonjour
    J'ai un super ami qui s'apelle Google
    je demande de l'aide si je trouve pas sur google

    j'utilise itertools deja , le problème c'est comment parcourir tous les dossiers.
    j'ai crée un code mais ça beugue , il prend juste la première itération c'est tout
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def combine(x,y):
        Rn ='../Desktop/Radionucléide/'+x+'/*.xlsx' 
        addrs = glob.glob(Rn)
        Rn1 =Rn ='../Desktop/Radionucléide/'+y+'/*.xlsx'
        addr = glob.glob(Rn1)
        return(addrs,addr)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    comb=list(combinations(liste,2))
    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
    for i in comb:
        addrs,addr=combine(i[0],i[1])
        f=0.2
        #file=i+f+str(1-f)
        file="{}_{}-{} ".format(i, f, 1-f)
        dirName ='Radionucléide/'+file
        try:
            os.mkdir(dirName)
            print("Directory " , dirName ,  " Created ") 
        except FileExistsError:
            print("Directory " , dirName ,  " already exists")
        for i,j,k in zip(addrs,addr,range(len(addrs))):    
            x=trace_spectre(i) 
            y=trace_spectre(j)
            figure=dirName,file ,str(k),'.png'
            c=f*x+(1-f)*y
            plt.vlines(x=[i for i in range(0,2200,15)],ymin=0,ymax=c,color='black')
            plt.plot([i for i in range(0,2200,15)],c,'k')
            plt.savefig(figure)
            plt.show()
    sortie: il crée juste un seul dossier qui correspond au premier élément de ma liste
    erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    ValueError: fname must be a PathLike or file handle

  7. #7
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    C'est pourtant relativement clair.

    Je n'ai pas la ligne où est soulevé l'erreur mais je présume que c'est celle où il y a trace_spectre.
    Cette fonction attends en paramètre soit un PathLike soit un filehandle. Je présume que PathLike est un truc qui doit sortir de la fonction Path de la librairie pathlib. Et un file handle c'est un fichier déjà ouvert :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    with open('mon_nom_de_fichier.txt','r') as filehandle :
             data = filehandle.read() #### Par exemple mais ici servez vous simplement du handle pour le passer à trace_spectre

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 05/04/2014, 13h26
  2. Algorithme combinaisons d'éléments d'une liste
    Par smallbean dans le forum Langage
    Réponses: 2
    Dernier message: 17/11/2010, 16h11
  3. Génération d'une liste de combinaison
    Par Paniez dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 01/07/2008, 09h52
  4. Obtenir la liste des combinaisons de p éléments d une liste de n éléments?
    Par Stéphane Nadry dans le forum Général Python
    Réponses: 7
    Dernier message: 18/02/2008, 20h16

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