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 :

Mutation des dictionnaires


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Profil pro
    Ingénieur sécurité
    Inscrit en
    Février 2007
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 574
    Par défaut Mutation des dictionnaires
    Bonjour à tous,
    Débutant en python, je n'arrive pasà trouver de réponse à ceci:
    Au lieu de faire par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    dic = {"john":"lock","jack":"sheppard"}
    for k, v in dic.iteritems():
        dic[k] = v.upper()
    J'aimerais utiliser la mutation si pratique aux listes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dic = [v.upper() for k, v in dic.iteritems()]
    Bien sur celà me renvoi une liste (logique). Comment indiquer de ne rien faire sur la clé du dictionnaire?
    Merci

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dic.update([ (k,v.upper()) for k,v in dic.iteritems() ])
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [ dic.update([(k,v.upper())]) for k,v in dic.iteritems() ]

    Je ne sais pas pourquoi tu parles de mutation pour ce qui ressemble à une liste par compréhension.
    D'ailleurs je trouve les deux instructions ci-dessus bizarres pour tout dire. Je n'arrive pas à considérer que ce sont des listes par compréhension proprement dites.

  3. #3
    Membre chevronné
    Profil pro
    Ingénieur sécurité
    Inscrit en
    Février 2007
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 574
    Par défaut
    Citation Envoyé par eyquem Voir le message
    Je ne sais pas pourquoi tu parles de mutation
    C'est le terme employé dans le livre Dive into Python.
    Citation Envoyé par eyquem Voir le message
    Je n'arrive pas à considérer que ce sont des listes par compréhension proprement dites.
    Je comprends pas trop ce que tu veux dire.
    En tout cas, merci pour ta réponse rapide. Pour info, j'ai trouvé la même astuce et plein d'autres, à cette adresse.

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Je n’avais pas remarqué ou pas retenu que la traduction de Dive into Python emploie le mot ’mutation’.



    Je ne trouve pas cet emploi très clair, je n’arrive pas à comprendre quel terme c’est censé traduire: ’list comprehension’ ou ’mapping’ ?



    De plus, ça met l’accent plutôt sur le fait qu’un objet (liste, ou autre, comme un dictionnaire dans ton cas) est soumis à une transformation
    que sur le fait que quelque chose est produit, ce qui me semble être l’important puisqu’on peut produire quelque chose avec une “list comprehension“ sans que la liste parcourue soit importante en elle-même.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    A = [23,45,2,14,56,398,45903,256,11,901,607,4578,340,3,8,45,907]
    li = [ A[i]**3 for i in xrange(5,13)]
    print li
    EDIT: ouais , bon, cet exemple n'est pas très bon, on doit pouvoir trouver mieux. Car on peut aussi écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    li = [el**3 for el in A[5:13] ]




    Mais le terme de “list comprehension“ n’est pas lui même approprié à certains cas, dans lesquels je ne vois pas où est la liste censée être produite.
    Comme me l’a expliqué Zavonen récemment dans ce post ,
    http://www.developpez.net/forums/d78...s/#post4520186
    il faut traduire ’list comprehension’ par ’liste en compréhension’ , et cela désigne une liste entièrement déterminée par une propriété caractéristique de ses éléments.

    Or il y a des cas où je ne vois pas de liste produite par une liste comprehension. Ton exemple en est un: il y a modification d’un dictionnaire mais celui-ci existait avant l’exécution. On me dira, oui mais quand même ça produit bien un dictionnaire.

    Alors voilà un code idiot qui utilise une list comprehension sans rien produire d’autre qu’un affichage: ça a un effet, mais ça ne produit aucun objet.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    from time import strftime,sleep
     
    def f(x):
        print strftime('\n%H:%M:%S')
        t = strftime('%M:%S').partition(':')
        sleep(x/20. + int(t[0])/40. + (int(t[2])%5)/4.)
     
    [ f(x/100.) for x in xrange(100) ]
    Tout cela resterait des chinoiseries si ce n’était que ce qu’on appelle ’list comprehension’ me semble être plus que ce qu’exprime leur nom.

  5. #5
    Membre Expert Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Par défaut
    Alors voilà un code idiot qui utilise une list comprehension sans rien produire d’autre qu’un affichage: ça a un effet, mais ça ne produit aucun objet.
    ça renvoie quand même une liste de None

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Aaaaaaaah ouiiiii ! Bien vu pacificator. +1



    print [ f(x/100.) for x in xrange(3) ]

    imprime [None,None,None]



    Donc pendant que ça tourne, il y a une liste qui est construite peu à peu.

    Une fois le parcours terminé, comme cette liste n’est assignée à aucun nom, elle flotte dans la mémoire tant que la solliciation de la mémoire n’écrit rien à son emplacement, qui n’est pas réservé.

    Je pense qu’il n’est même pas question de garbage collector puisque cette liste flottante n’a aucun nom.

    Voilà comment je vois les choses maintenant.

    C’est éclairant. Je ne sais pas ce que ça éclaire mais c’est mieux que l’impression de magie noire que ça me donnait.

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

Discussions similaires

  1. Réponses: 23
    Dernier message: 28/11/2013, 13h42
  2. Performance des Dictionnaires
    Par Jerede dans le forum C#
    Réponses: 3
    Dernier message: 21/01/2011, 23h53
  3. [Kile] Configuration des dictionnaires
    Par imade dans le forum Editeurs / Outils
    Réponses: 0
    Dernier message: 13/08/2007, 12h42
  4. [Access2003][VBA]Utilisation des Dictionnaires
    Par hoaxpunk dans le forum VBA Access
    Réponses: 2
    Dernier message: 15/05/2007, 21h21
  5. l'Union des dictionnaires
    Par aliassaf dans le forum Général Python
    Réponses: 4
    Dernier message: 24/06/2006, 12h59

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