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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 741
    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 741
    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 670
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 670
    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 741
    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 741
    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.

Discussions similaires

  1. Un fichier dictionnaire ?
    Par portu dans le forum Windows
    Réponses: 6
    Dernier message: 17/04/2007, 15h26
  2. [JTextField] filtrer la saisie
    Par Merfolk dans le forum Composants
    Réponses: 7
    Dernier message: 04/03/2004, 19h57
  3. Filtrer les voyelles
    Par Babyneedle dans le forum Langage SQL
    Réponses: 9
    Dernier message: 22/12/2003, 15h12
  4. peut on filtrer les adresses IP ?
    Par travail dans le forum 4D
    Réponses: 2
    Dernier message: 04/06/2003, 14h16
  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, 10h55

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