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 :

Filtrer un dictionnaire


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2021
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2021
    Messages : 8
    Par défaut Filtrer un dictionnaire
    Bonsoir à tous,
    dans le cadre d'un projet POO, nous devons réaliser un programme permettant de lire des jeux de données csv et d'effectuer certaines manipulations dont le filtrage de données. Un peu comme en SQL, le but est de pouvoir sélectionner uniquement certains objets. Je vais prendre un exemple concret:
    On a nos données importées et stockées dans un dict:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dico={'jour': 19/03/2020 …, 'nomReg':Auvergne-Rhône-Alpes…, 'numReg' : 64…, 'incidrea' : 44}
    La fonction pour filtrer les données serait: filtrage_donnnées(filtres_select) :
    filtres_select est un dictionnaire. Chaque clé = une variable, les valeurs sont les données qu’on veut.

    Exemple : on veut les données en Bretagne, en Ile-de-France, le 19 et le 20 mars où on a incidrea entre 20 et 60 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    filtres_select={'jour'=[19/03/2020, 20/03/2020], 'nomReg'=['Bretagne', 'Ile-de-France'], 'incidrea'=20:60}
    et ça retourne les données filtrées de cette manière.

    Sur le papier, c'est bien beau mais en pratique, je ne vois pas comment aboutir à ce résultat. Je précise, qu'on ne peut pas utiliser le module panda ou un module SQL.
    Je vous remercie d'avance.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 790
    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 790
    Par défaut
    Salut,

    Citation Envoyé par y_r2611 Voir le message
    Sur le papier, c'est bien beau mais en pratique, je ne vois pas comment aboutir à ce résultat.
    Simplifiez le problème.

    Imaginez avoir à filtrer filtres_select={ 'nomReg':'Bretagne' }, c'est faire une boucle pour tester les dictionnaires pour lesquels nomReg='Bretagne'.

    Cela fait, compliquez un peu: plusieurs clés dans le filtre, il va falloir faire une boucle pour tester chacune des clefs...

    Lorsqu'il y a plusieurs valeurs, un intervalle,... il faut déjà reconnaître la représentation pour savoir faire mais ce sont des décisions arbitraires à faire.

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

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2021
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2021
    Messages : 8
    Par défaut
    Salut wiztricks,

    Merci pour ta réponse. En effet c'est très compliqué et démarrant tout juste la programmation, je dois reconnaître que je patauge. Comme tu as pu l'évoquer, la gestion des intervalles pose une contrainte supplémentaire que j'ai du mal à traiter.
    Sans forcément donner tout le détail du code, je pense qu'une syntaxe générale sur les boucles à réaliser me débloquerait un peu.
    Autre solutions à laquelle je songe:
    * Implicitement, on nous demande en fait de coder un SGBD en python : l'utilisateur importe ses tables, des filtres sont appliqués, des statistiques de base peuvent être réalisées.
    Dans cette perspective, le module sqlite3 aurait été fort utile mais on ne peut pas l'utiliser. Est-il néanmoins possible de visualiser la façon dont est codé le module en python afin de comprendre comment les requêtes sont définies?
    * Au vu de mon niveau débutant, est-il réalisable de coder un sgbd en python qui utiliserait le langage sql?

  4. #4
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 706
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 706
    Par défaut
    quand wiztricks parlait de représentation, je vois deux façon de faire.

    1re façon : la façon de filtrer est liée au champ, par exemple le champ "incidea" est un intervalle et pour le champ "région", il s'agit des éléments.
    l'avantage de cette façon de faire est que cela allège l'appel du filtre, il suffit d'indiquer les bornes [20, 60]

    2e façon : le type de filtre est indiqué à l'appel du filtre.
    donc on pourrait garder seulement les éléments "20" et "60" en utilisant {"type_filtre" : "elements", "valeurs" : [20, 60]}
    ou alors filtrer sur un intervalle avec {"type_filtre" : "intervalle", "valeurs" : [20, 60]}

    au final le choix entre ces 2 façons de faire se fait par rapport aux fonctionnalités attendues. donc si vous n'avez pas un projet concret mais juste un exercice, c'est plus compliqué de choisir.
    et puisque aucune de ces méthodes est meilleure que l'autre, ça pourrait être intéressant pour vous d'essayer de faire les 2.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2021
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2021
    Messages : 8
    Par défaut
    Bonsoir Mathieu, merci pour votre réponse.
    La 2e option me paraît judicieuse, je vais essayer de partir sur ça. Ce que j'essaye de coder s'inscrit dans le cadre d'un projet POO de gestion de jeux de données COVID. C'est pour cette raison que j'essaye de faire des méthodes qui peuvent être réutilisables pour tout type de données. Malheureusement je dois reconnaître que faire ce travail d'abstraction m'est encore compliqué

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 790
    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 790
    Par défaut
    Salut,

    Citation Envoyé par y_r2611 Voir le message
    Sans forcément donner tout le détail du code, je pense qu'une syntaxe générale sur les boucles à réaliser me débloquerait un peu.
    La structure du code serait identique si nous avions à filtrer des entiers:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    R = [] # le résultat
    for e in L:
         if condition(e):
            R.append(e)
    Citation Envoyé par y_r2611 Voir le message
    Implicitement, on nous demande en fait de coder un SGBD en python... Est-il néanmoins possible de visualiser la façon dont est codé le module en python afin de comprendre comment les requêtes sont définies?
    On vous demande juste d'écrire des fonctions pour filtrer des données dans une liste de dictionnaires. Et si un SGDB peut permettre de faire cela avec un SELECT... le but est peut être de vous permettre d'apprendre à programmer en mettant les mains dans le cambouis.

    Citation Envoyé par y_r2611 Voir le message
    * Au vu de mon niveau débutant, est-il réalisable de coder un sgbd en python qui utiliserait le langage sql?
    Si vous avez 2/3 ans à passer la dessus, c'est possible.
    Et arriver à faire l'exercice qu'on vous demande d'ici la fin de la semaine serait un premier pas.

    - W
    ps: "l'homme qui déplace une montagne commence par emporter de petites pierres." - Confucius
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2021
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2021
    Messages : 8
    Par défaut
    Du coup, selon vos différents conseils, j'ai défini la méthode suivante. Je vais essayer de commenter chaque étape:

    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
    def filtrage_données(filtres_select):
            "filtres_select={nom_filtre1:[element,element,intervalle]}"
            donnees_filtrees=[]
            for i in range(len(list(filtres_select.keys()))):
                if list(filtres_select.keys())[i]==[list(dico.keys())[k] for k in range(len(list((dico.keys()))))]:
                    col_donnees_filtrees=[]
                    if list(filtres_select.values())[-1]=='intervalle':
                        for v in dico.values():
                            if v>list(filtres_select.values())[0]&v<list(filtres_select.values())[1]:
                                col_donnees_filtrees.append(v)
                            else:
                                col_donnees_filtrees.append(None)
                        donnees_filtrees.append(col_donnees_filtrees)
                    if list(filtres_select.valeurs())[-1]=='éléments':
                        for v in dico.values():
                            if v==[list(filtres_select.values())[l] for l in range(len(list(filtres_select.values())))]:
                                col_donnees_filtrees.append(v)
                            else:
                                col_donnees_filtrees.append(None)
                        donnees_filtrees.append(col_donnees_filtrees)
     
                    if list(filtres_select.valeurs())[-1]!=('élements'or'intervalle'):
                        print('Erreur le champ renseigné est incorrect')

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2021
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2021
    Messages : 8
    Par défaut
    Ligne 4: on parcourt les clés du dictionnaire qui correspond au filtre défini
    Ligne 5: si une clé correspond à une clé du fichier qu'on a importé (exemple l'utilisateur défini nomReg comme filtre) alors on crée une liste vide relative à ce filtre qui recevra les données filtrées
    Ligne 7-10: si l'utilisateur a entré 'intervalle' comme dernier élément de la liste i des valeurs de filtres_select alors, on extrait du dictionnaire des données les valeurs comprises dans cet intervalle
    Ligne 14-20: même principe mais avec 'éléments'

    Pour finir, on supprimera les éléments "None" dans chaque liste (pas encore codé).

    Voilà, après un premier test, aucune erreur n'est retournée. Cependant, donnees_filtrees est toujours une liste vide...
    Merci encore pour vos réponses.

  9. #9
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 706
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 706
    Par défaut
    qu'est ce que vous avez dans "dico" pour tester cette fonction ?
    dans le principe, j'aurais pensé à une liste de "set" mais au début de votre code, vous faites "dico.keys()" donc il y a un souci de format.

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2021
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2021
    Messages : 8
    Par défaut
    dico est un dictionnaire censé représenter un jeu de données. Une clé = une variable associée à une liste de valeurs.
    Par exemple pour ce jeu de données:

    Nom : Capture.PNG
Affichages : 937
Taille : 15,6 Ko

    on a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dico={'jour': [19/03/2020], 'nomReg':[Auvergne-Rhône-Alpes…], 'numReg' : [64], 'incidrea' : [44]}
    Autre chose, il y avait quelques erreurs dans le code (notamment valeurs() au lieu de values()).. Je l'ai modifié:
    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
    def filtrage_données(filtres_select):
            "filtres_select={nom_filtre1:[element,element,intervalle]}"
            donnees_filtrees=[]
            for i in range(len(list(filtres_select.keys()))):
                col_donnees_filtrees=[]
                if list(filtres_select.keys())[i]==[list(dico.keys())[k] for k in range(len(list((dico.keys()))))]:
                    if list(filtres_select.values())[-1]=='intervalle':
                        for v in dico.values():
                            if v>list(filtres_select.values())[0]&v<list(filtres_select.values())[1]:
                                col_donnees_filtrees.append(v)
                            else:
                                col_donnees_filtrees.append(None)
                        donnees_filtrees.append(col_donnees_filtrees)
                    if list(filtres_select.values())[-1]=='éléments':
                        for v in dico.values():
                            if v==[list(filtres_select.values())[l] for l in range(len(list(filtres_select.values())))]:
                                col_donnees_filtrees.append(v)
                            else:
                                col_donnees_filtrees.append(None)
                        donnees_filtrees.append(col_donnees_filtrees)
     
                    if list(filtres_select.values())[-1]!=('élements'or'intervalle'):
                        print('Erreur le champ renseigné est incorrect')
            return(donnees_filtrees)
    Néanmoins, ça ne règle pas le problème: pas derreur mais une liste vide retournée

  11. #11
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 706
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 706
    Par défaut
    au début pour le "for i", vous pouvez directement parcourir les clés en faisant for cle_filtre in filtres_select.keys() :
    et vous aurez donc le champ à filtrer dans "cle_filtre".

    ensuite dans le if, vous faites une boucle "for k" pour lister les clé du dictionnaire. vous pouvez résumer ça en list(dico.keys())

    dans le "if" vous voulez tester si "cle_filtre" est bien une colonne du dictionnaire ?

  12. #12
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 790
    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 790
    Par défaut
    Salut,

    Citation Envoyé par y_r2611 Voir le message
    Voilà, après un premier test, aucune erreur n'est retournée. Cependant, donnees_filtrees est toujours une liste vide...
    Si vous aviez commencé à écrire "petit" comme je vous l'avais suggéré, vous sauriez retourner quelque chose dans donnees_filtrees (ou relire plus facilement le code que vous avez écrit pour comprendre pourquoi çà ne marche pas).

    Là vous êtes parti à vouloir faire "grand" et c'est nous qui devons relire votre code pour comprendre ce que vous avez essayé de faire...

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

  13. #13
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2021
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2021
    Messages : 8
    Par défaut
    Je comprends parfaitement votre réponse wiztricks. Si vous le permettez mathieu, je vais plutôt garder mes boucles et conditions telles quelles. En adoptant votre démarche, j'ai eu des messages d'erreur de type 'index out of range'. On va donc partir sur un filtre de type 'intervalle'.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    def filtre_intervalle(filtres_select):
        donnees_filtrees=[] #création d'une liste vide qui contiendra les données filtrées
        for i in range(len(list(filtres_select.keys()))): #i parcourt les clés du dict filtres_select. Par exemple, si l'utilisateur veut filtrer sur nomReg et jour, les clés sont 'nomReg' et 'jour'
            col_donnees_filtrees=[] #création d'une première liste qui reçoit à chaque itération les données d'une variable filtrée (dans notre exemple, à la 1ère itération elle reçoit les données de nomReg) 
            if list(filtres_select.keys())[i]==[list(dico.keys())[k] for k in range(len(list((dico.keys()))))]: #si l'élément i de la liste des clés de filtres_select correspond à une clé du dictionnaire de données (dans notre exemple 'nomReg' de filtres_select = 'nomReg' du dico de données) on passe à la suite
                if list(filtres_select.values())[-1]=='intervalle': #si l'utilisateur spécifie que le champ de filtrage est un intervalle on passe à la suite
                    for v in dico.values(): #v parcourt les valeurs associées à la clé du dictionnaire de données (dans notre exemple, v parcourt les valeurs de 'nomReg')
                        if v>list(filtres_select.values())[0]&v<list(filtres_select.values())[1]: #si v est compris dans l'intervalle sélectionné alors, on ajoute cette valeur à donnees_filtrees
                            col_donnees_filtrees.append(v)
                        else:
                            col_donnees_filtrees.append(None) #sinon on ajoute None à donnees_filtrees
                    donnees_filtrees.append(col_donnees_filtrees)
    Quand je teste uniquement cette partie du code avec des régions, ça me renvoie désormais None: ce qui est logique comme on travaille dans cet exemple avec des chaines de caractère. Un autre problème arrive quand je traite des dates. Par exemple si je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    filtres_select={'jour':[19-03-2020, 31-03-2020, 'intervalle']}
    On me renvoie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        filtres_select={'jour':[19-03-2020, 31-03-2020, 'intervalle']}
                                    ^
    SyntaxError: invalid token
    Ici, Python semble ne pas comprendre qu'il s'agit d'une date.

  14. #14
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 790
    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 790
    Par défaut
    Citation Envoyé par y_r2611 Voir le message
    Ici, Python semble ne pas comprendre qu'il s'agit d'une date.
    Pour Python 19-03-2020 pourrait être une suite de nombres sous forme littérale dont on fait la soustraction (mais çà ne va pas aimer le 0 en tête de 03).
    La chaine de caractères "19-03-2020" pourrait être la représentation d'une date pour l'humain mais il va peut être falloir la mouliner en datetime.date pour en faire quelque chose avec lequel l'ordinateur puisse comparer avec...

    Et comme votre code montre aussi que vous ne savez pas trop utiliser un dictionnaire, çà fait pas mal de chose à potasser avant de vouloir écrire du code...

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

  15. #15
    Membre éprouvé Avatar de olivier1969
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Novembre 2013
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 153
    Par défaut
    Bonjour,

    Avez vous la possibilité d'utiliser ces modules :

    import pymongo
    import bsonjs
    import bsonL'intérêt serai de pouvoir convertir les date en ISODate et autres données dans un BSON et ainsi appliquer les filtres/tris de pymongo.

  16. #16
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 706
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 706
    Par défaut
    je me suis replongé dans cette histoire de tri et j'ai fait un essai en transformant d'abord vos données en une liste d'enregistrements dans liste_donnees :

    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
     
    import copy
     
    dico = {
    	"nombre" : [5, 		2,		3,		4,],
    	"etape" :  ["e5", 	"e2",	"e3",	"e4",],
    }
     
    # réorganisation des données
     
    liste_champs = list(dico.keys())
    liste_donnees = []
     
    for index in range(len(dico[liste_champs[0]])) :
     
    	element = {}
     
    	for nom_champ in liste_champs : 
    		element[nom_champ] = dico[nom_champ][index]
     
    	liste_donnees.append(element)
     
     
    # fonction de filtrage
     
    def filtrage_element(filtres_select, element) :
     
    	"filtres_select = {nom_champ : [element, element, intervalle]}"
     
    	for (cle_filtre, tab_filtre) in filtres_select.items() :
     
    		if cle_filtre not in liste_champs :
    			print("le champ {} n\'existe pas".format(cle_filtre))
    			return False
     
    		if tab_filtre[-1] not in ["elements", "intervalle"] :
    			print("Erreur le champ renseigné est incorrect")
    			return False
     
     
    		if (
    				(tab_filtre[-1] == "intervalle")
    			&
    			(
    					(element[cle_filtre] < tab_filtre[0])
    				|	(element[cle_filtre] > tab_filtre[1])
    			)
    		) :
    			return False
     
    		if (
    				(tab_filtre[-1] == "elements")
    			&	(element[cle_filtre] not in tab_filtre[0:-1])
    		) :
    			return False
     
     
    	return True
    # fin de def filtrage_element(filtres_select, element) :
     
     
    # parcours des élément de liste_donnees
     
    filtres_select = {
    	"nombre" : [1, 3, "intervalle"],
    	"etape" : ["e1", "e2", "elements"],
    }
     
    donnees_filtrees = list(element for element in liste_donnees if filtrage_element(filtres_select, element))
     
     
    # affichage
     
    def afficher_liste(liste) :
     
    	print("[");
     
    	for element in liste :
    		print("    " + str(element) + ",")
     
    	print("]");
     
     
    print("données d'origine : ")
    afficher_liste(liste_donnees)
     
    print("données filtrées : ")
    afficher_liste(donnees_filtrees)
     
     
    """
    résultat : 
     
    données d'origine : 
    [
        {'etape': 'e5', 'nombre': 5},
        {'etape': 'e2', 'nombre': 2},
        {'etape': 'e3', 'nombre': 3},
        {'etape': 'e4', 'nombre': 4},
    ]
     
    données filtrées : 
    [
        {'etape': 'e2', 'nombre': 2},
    ]
     
    """

  17. #17
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 790
    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 790
    Par défaut
    Salut,

    Bel effort. Ceci dit imaginez faire écrire à l'utilisateur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    filtres_select = {
    	"nombre" : intervalle(1, 3),
    	"etape" : elements("e1", "e2"),
    }
    plutôt que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    filtres_select = {
    	"nombre" : [1, 3, "intervalle"],
    	"etape" : ["e1", "e2", "elements"],
    }
    ne va pas fondamentalement changer sa vie mais côté réalisation, çà évite d'avoir à interpréter des chaines de caractères.

    On les remplace par des appels à des closures:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def intervalle (a, b):
         def test(x):
               return a < x < b
         return test
    Et si l'interface est bien définie (retourne le booleen True si f(x) est vraie....), l'appelant peut coder/compléter çà par lui même:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    filtres_select = {
    	"nombre" : lambda x: 1 < x < 3,
    	"etape" : lambda x: x in ("e1", "e2"),
    }
    Vous comprenez l'idée?

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

  18. #18
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2021
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2021
    Messages : 8
    Par défaut
    Bonjour à tous,

    Après un dur labeur, j'ai quasiment trouvé la solution. Je vous l'envoie ci peu, d'ici une semaine si ça peut dépanner quelqu'un d'autre. Merci beaucoup pour votre implication en tout cas.

Discussions similaires

  1. Un fichier dictionnaire ?
    Par portu dans le forum Windows
    Réponses: 6
    Dernier message: 17/04/2007, 16h26
  2. [JTextField] filtrer la saisie
    Par Merfolk dans le forum Composants
    Réponses: 7
    Dernier message: 04/03/2004, 20h57
  3. Filtrer les voyelles
    Par Babyneedle dans le forum Langage SQL
    Réponses: 9
    Dernier message: 22/12/2003, 16h12
  4. peut on filtrer les adresses IP ?
    Par travail dans le forum 4D
    Réponses: 2
    Dernier message: 04/06/2003, 15h16
  5. [VBA-E] [Excel] Filtrer le donnees d'une sheet
    Par donia dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 27/09/2002, 11h55

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