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 :

Bug de liste!


Sujet :

Python

  1. #1
    Membre averti
    Homme Profil pro
    Gestionnaire d'environnement et coordinateur technique de projet
    Inscrit en
    Mars 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Gestionnaire d'environnement et coordinateur technique de projet

    Informations forums :
    Inscription : Mars 2014
    Messages : 13
    Par défaut Bug de liste!
    Bonjour,

    Mon problème est plutôt bizarre.
    J'affecte des valeurs à un dictionnaire.
    J'ajoute ce dictionnaire à la fin d'une liste.
    je répète ça 3x.

    Mon problème est que les dictionnaires ajouté à la fin de la liste ne correspondent pas…

    Le code qui plante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    L = []
            for element in list_dict_cadre:
                for key, value in element.items():
                    dict_resa[key] = value
                if check_flag:
                    dict_resa[Col_REmp] = resto[element[11].lower()]
                if poq_flag:
                    dict_resa[Col_POQ] = dict_poq[element[11]]
                L.append(dict_resa)
                print(dict_resa)
            print(L)
    Ici par exemple la valeur du print(dict_resa) m'affiche les bonnes données mais pas le print(L)!

    Merci

  2. #2
    Membre Expert Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Par défaut
    Bonjour

    ce n'est pas possible de se pencher sur ton problème.
    Trop de variables inconnues (pour le lecteur) sont utilisées dans le code que tu postes.

    Et qu'est-ce que tu entends pas :
    Citation Envoyé par nihlus
    Mon problème est que les dictionnaires ajouté à la fin de la liste ne correspondent pas…
    Des dictionnaires qui (ne) "correspondent" (pas) : en français ?

  3. #3
    Membre averti
    Homme Profil pro
    Gestionnaire d'environnement et coordinateur technique de projet
    Inscrit en
    Mars 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Gestionnaire d'environnement et coordinateur technique de projet

    Informations forums :
    Inscription : Mars 2014
    Messages : 13
    Par défaut
    Voila la fonction complète mais je pense que ça n'aidera pas…

    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
        def extractNewResa(self, file):
            flag = True
            complete_path = file
            file = file.split('/')
            file = file[len(file) - 1]
            num = file.split('-')[0]
            numTT = num.split(' ')
            if numTT[0] != "TT" or numTT[1].isdigit() == False:
                self.tab_new_resa = TITLE_ERROR
     
            fast_ref = "FAST0" + numTT[1]
            wb = xlrd.open_workbook(RESA)
            sheet_src = wb.sheet_by_index(0)
     
            for row_index in range(sheet_src.nrows):
                if sheet_src.cell_value(row_index, 1) == fast_ref:
                    flag = False
     
            if flag:
                wb = xlrd.open_workbook(complete_path)
                check_flag = False
                poq_flag = False
                sheet = wb.sheet_by_name("Réservation")
                dict_resa = {}
                self.tab_new_resa = []
                date = datetime.date
     
                dict_resa[Col_Type] = "réservation"
                dict_resa[Col_TT] = fast_ref
                dict_resa[Col_App] = sheet.cell_value(4, 2)
                dict_resa[Col_Lib] = sheet.cell_value(5, 2)
                dict_resa[Col_Statut] = "A valider"
                objDate = Date(wb, sheet.cell_type(7, 2), sheet.cell_value(7, 2))
                dict_resa[Col_MeP] = objDate.getDate()
                dict_resa[Col_Demand] = sheet.cell_value(3, 2)
                dict_resa[Col_TTdate] = date.today().strftime('%d/%m/%Y')
                dict_resa[Col_Gecsi] = sheet.cell_value(8, 2)
                dict_resa[Col_Version] = sheet.cell_value(9, 2)
                dict_resa[Col_Adh] = sheet.cell_value(sheet.nrows-1, 2)
     
                checkbox_sheet = wb.sheet_by_name("CheckBox")
                if checkbox_sheet.cell_value(10, 1) == 1:
                    check_flag = True
                    resto = {}
                    nbEmp = int(checkbox_sheet.cell_value(19, 4))
                    dict_resa[Col_PEmp] = checkbox_sheet.cell_value(17, 5)
                    resto[checkbox_sheet.cell_value(18, 6)] = checkbox_sheet.cell_value(18, 5)
                    for i in range(20, 20+nbEmp):
                        if checkbox_sheet.cell_value(i, 5) == "":
                            break
                        resto[checkbox_sheet.cell_value(i, 6)] = checkbox_sheet.cell_value(i, 5)
            else:
                self.tab_new_resa = EXISTING_TT
     
            if checkbox_sheet.cell_value(9, 1) == 1:
                notes = sheet.cell_note_map
                nameObj = wb.name_and_scope_map.get(('datesdisponibilite', -1))
                y = nameObj.area2d()[1:5][0]
                x = nameObj.area2d()[1:5][2]
                if notes[y, x].text != None:
                    poq_flag = True
                    poq = notes[y, x].text
                    list_poq = poq.split('\n')
                    dict_poq = {}
                    for i in list_poq:
                        dict_poq[i.split(' ')[1]] = i
     
            myMinResa = wb.name_and_scope_map.get(('deb', -1)).area2d()[1:5]
            myMaxResa = wb.name_and_scope_map.get(('fin', -1)).area2d()[1:5]
            list_dict_cadre = []
            for i in range(myMinResa[0]+1, myMaxResa[0]):
                dict_cadre = {}
                if sheet.cell_value(i, 1) != None:
                    util = sheet.cell_value(i, 1)
                    cadre = sheet.cell_value(i, 2)
                    objDate = Date(wb, sheet.cell_type(i, 3), sheet.cell_value(i, 3))
                    deb = objDate.getDate()
                    objDate = Date(wb, sheet.cell_type(i, 4), sheet.cell_value(i, 4))
                    fin = objDate.getDate()
                if deb != None and fin != None:
                    dict_cadre[Col_Util] = util
                    dict_cadre[Col_Deb] = deb
                    dict_cadre[Col_Fin] = fin
                    dict_cadre[Col_Cadre] = cadre
                    list_dict_cadre.append(dict_cadre)
     
            L = []
            for element in list_dict_cadre:
                for key, value in element.items():
                    dict_resa[key] = value
                if check_flag:
                    dict_resa[Col_REmp] = resto[element[11].lower()]
                if poq_flag:
                    dict_resa[Col_POQ] = dict_poq[element[11]]
                L.append(dict_resa)
                print(dict_resa)
            print(L)
    En gros ce que je disais tout à l'heure c'est que les dictionnaires ajoutée dans L ne correspondent pas aux dictionnaires affiché dans la boucle. Par exemple

    Sortie dans la boucle =>
    {a: 'a', b: 'b', c: 'c'}
    {d: 'd', e: 'e', f: 'f'}
    {g: 'g', h: 'h', i: 'i'}

    Contenu de L:
    [{g: 'g', h: 'h', i: 'i'}
    {g: 'g', h: 'h', i: 'i'}
    {g: 'g', h: 'h', i: 'i'}] // L contient seulement le dernier dictionnaire affiché alors que le print m'affiche bien les 3...

  4. #4
    Membre Expert Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Par défaut
    Avoir le code en entier permet de bien vérifier que les lignes que tu as postées sont bien contigues (l'indentation "bizarre" était suspecte).

    Donc, dans ta boucle à partir (dernier post) de la ligne 88, la variable dict_resa correspond à un même objet/dictionnaire !
    Au fur et à mesure de tes itérations, tu le mets à jour (voir les résultats print (dict_resa)), mais tu t'attaques toujours au même dictionnaire.

    En fin de boucle, la liste contient le même dictionnaire, après la dernière mise à jour ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    >>> L = list()
    >>> dico = dict()
    >>> 
    >>> for i in range(3):
    ...     dico['iteration'] = i
    ...     print(dico)
    ...     L.append(dico)
    ... 
    {'iteration': 0}
    {'iteration': 1}
    {'iteration': 2}
    >>> 
    >>> print(L)
    [{'iteration': 2}, {'iteration': 2}, {'iteration': 2}]

  5. #5
    Membre averti
    Homme Profil pro
    Gestionnaire d'environnement et coordinateur technique de projet
    Inscrit en
    Mars 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Gestionnaire d'environnement et coordinateur technique de projet

    Informations forums :
    Inscription : Mars 2014
    Messages : 13
    Par défaut
    Je comprend pas du tout comment c'est possible O_o
    Pour moi :

    L.append(dico)

    Devrait vraiment contenir les 3 dictionnaires différents vu que le print les affiches bien correctement -_-'


    EDIT: DAMN j'ai pigé… bon je cherche un moyen de corriger ça du coup.

  6. #6
    Membre Expert Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Par défaut
    Citation Envoyé par nihlus
    Devrait vraiment contenir les 3 dictionnaires différents vu que le print les affiches bien correctement -_-'
    Pas du tout. L'affichage ne se fait pas à la fin mais avant de re-modifier le dictionnaire. Il ne fait que refléter l'état du dictionnaire au moment où tu l'affiches.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    >>> L = list()
    >>> for i in range(3):
    ...     dico = dict()
    ...     dico['iteration'] = i
    ...     L.append(dico)
    ...     print(dico)
    ... 
    {'iteration': 0}
    {'iteration': 1}
    {'iteration': 2}
    >>> print(L)
    [{'iteration': 0}, {'iteration': 1}, {'iteration': 2}]
    Là, oui !

  7. #7
    Membre averti
    Homme Profil pro
    Gestionnaire d'environnement et coordinateur technique de projet
    Inscrit en
    Mars 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Gestionnaire d'environnement et coordinateur technique de projet

    Informations forums :
    Inscription : Mars 2014
    Messages : 13
    Par défaut
    D'accord, en reprenant ton exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    L = []
            for element in list_dict_cadre:
                tmp = {}
                tmp = dict_resa
                for key, value in element.items():
                    tmp[key] = value
                if check_flag:
                    tmp[Col_REmp] = resto[element[11].lower()]
                if poq_flag:
                    tmp[Col_POQ] = dict_poq[element[11]]
                L.append(tmp)
            print(L)
    Ça ne fonctionne pas mieux.

  8. #8
    Membre Expert Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Par défaut
    la ligne 3 (tmp = {}) vole en éclats (est annulée) dès la ligne suivante (no 4) : tu affectes à tmp un dictionnaire existant ... et RE-belote ...

    (tmp EST le même objet que dict_resa)

    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
    >>> L = list()
    >>> dico_persistant = dict()
    >>> for i in range(3):
    ...     dico = dict()
    ...     dico = dico_persistant
    ...     dico['iteration'] = i
    ...     L.append(dico)
    ...     print(dico)
    ... 
    {'iteration': 0}
    {'iteration': 1}
    {'iteration': 2}
     
    >>> print(L)
    [{'iteration': 2}, {'iteration': 2}, {'iteration': 2}]
    dico = dico_persistant ne fait pas de dico un objet à part entière, un dictionnaire qui ne serait pas lié à dico_persistant. Tout le problème réside là !

  9. #9
    Membre averti
    Homme Profil pro
    Gestionnaire d'environnement et coordinateur technique de projet
    Inscrit en
    Mars 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Gestionnaire d'environnement et coordinateur technique de projet

    Informations forums :
    Inscription : Mars 2014
    Messages : 13
    Par défaut
    Le site bug désolé, mais j'ai trouvé une solution avant ta réponse.
    Du coup j'ai rajouté une boucle qui ajoute les éléments du dico un par un dans tmp.

    Maintenant ça fonctionne.

    Merci pour ton aide.

  10. #10
    Invité
    Invité(e)
    Par défaut
    Plutôt que de faire une boucle pour remplir une variable temporaire, le plus simple est de cloner le dictionnaire au début de la boucle. Comparez :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    In [10]: L = []
     
    In [11]: d = {'mon_dico': 'tartempion'}
     
    In [12]: for i in range(3):
       ....:     d['iteration'] = i
       ....:     L.append(d)
       ....:
     
    In [13]: L
    Out[13]:
    [{'iteration': 2, 'mon_dico': 'tartempion'},
     {'iteration': 2, 'mon_dico': 'tartempion'},
     {'iteration': 2, 'mon_dico': 'tartempion'}]
    et

    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
    In [14]: L = []
     
    In [15]: d = {'mon_dico': 'tartempion'}
     
    In [16]: for i in range(3):
       ....:     d = dict(d)
       ....:     d['iteration'] = i
       ....:     L.append(d)
       ....:
     
    In [17]: L
    Out[17]:
    [{'iteration': 0, 'mon_dico': 'tartempion'},
     {'iteration': 1, 'mon_dico': 'tartempion'},
     {'iteration': 2, 'mon_dico': 'tartempion'}]

Discussions similaires

  1. [AJAX] Bug double liste
    Par Mathieu92130 dans le forum AJAX
    Réponses: 26
    Dernier message: 03/05/2010, 14h28
  2. Bug dans liste deroulante
    Par Lou17 dans le forum IHM
    Réponses: 1
    Dernier message: 05/07/2008, 17h55
  3. Bug Access ? Liste déroulante . . .
    Par Benji01 dans le forum IHM
    Réponses: 3
    Dernier message: 19/05/2008, 01h08
  4. Bug taille liste déroulante et IE
    Par abbenoit dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 07/08/2007, 21h55
  5. Bug? (The List must be able to access one data set)
    Par nicolemans72 dans le forum BIRT
    Réponses: 3
    Dernier message: 19/01/2007, 20h53

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