7
votes

Plusieurs valeurs pour la clé dans le dictionnaire de Python

Ce que j'essaie de faire est d'obtenir 3 valeurs d'une clé en variables distinctes. Actuellement, je le fais comme ceci: XXX PRE>

Cela ne me semble pas très intuitif pour moi même s'il fonctionne. J'ai aussi essayé de faire cela: p> xxx pré>

Malheureusement, cela me donne un seul objet (ce que j'avais attendu), mais j'ai besoin des valeurs individuelles attribuées à la clé. Merci et m'excuse pour ma nouveauté à Python. P>

mise à jour forte> Toutes mes excuses de ne pas spécifier où je recevais mes valeurs. Voici comment je le fais pour le premier exemple. P>

names = {}

for name in objectNames:
    cmds.select(name)
    location = cmds.xform(q=True, ws=True, t=True)
    names[name] = location


1 commentaires

C'était ce que ma dernière tentative est sortie: noms = {} pour le nom dans ObjectNames: cmds.select (nom) emplacement = cmds.xform (q = true, ws = true, t = true) noms [nom] = Emplacement Pour la clé, (POSX, POSY, POSZ) dans NAMES.ITEMS (): JOINTPOSX = POSX JOINTYPOSY = POSY JOIXZZ = POSZ


3 Réponses :


2
votes

Si cela ne vous dérange pas d'une dépendance externe, vous pouvez inclure MultiDict de Werkzeugn:

Un multididit est une sous-classe de dictionnaire personnalisé pour traiter plusieurs valeurs pour la même clé qui est par exemple utilisée par les fonctions d'analyse des wrappers. xxx

Une autre façon de stocker plusieurs valeurs pour une touche est d'utiliser un type de conteneur, comme une liste , un définir ou un tuple .


1 commentaires

Cela ne me dérange pas du tout des dépendances externes, alors je vais donner à cela une tourbillon pour voir si c'est plus rapide ou non.



11
votes

Ce n'est pas inintuciant du tout.

Le seul moyen de stocker "Valeurs multiples" pour une clé donnée dans un dictionnaire consiste à stocker une sorte d'objet de conteneur comme valeur, telle qu'une liste ou une tuple. Vous pouvez accéder à une liste ou à un tuple en le sous-dominant, comme vous le faites dans votre premier exemple. P>

Le seul problème avec votre exemple est que c'est le moyen laid et gênant d'accéder à un tel conteneur lorsqu'il est utilisé dans Par ici. Essayez-la comme ça, et vous serez probablement beaucoup plus heureux: p> xxx pré>

Ainsi, votre deuxième exemple pourrait être le cas: P>

for name, pos in names.items():
    doSomethingWith(pos.x)
    doSomethingElseWith(pos.x, pos.y, pos.z)


4 commentaires

Je mentionnerais également pour la clé, (POSX, POSY, POSZ) dans NAMES.ITEMS ():


J'ai tenté d'utiliser votre méthode, mais j'ai gardé une erreur: trop de valeurs pour déballer. Cependant, lorsque j'ai utilisé votre deuxième exemple de Fabienandre, cela fonctionnait parfaitement. Je pense que le premier exemple n'a pas fonctionné à cause de la façon dont je reçois mes données à maya, mais je pourrais être tout à fait faux. Merci à vous deux!


@Arrant: Vous avez probablement attrapé ma première méthode avant que j'ai ajouté .ITEMS () à cela. J'édition toujours que pour grossièrement la même raison, j'oublie toujours la syntaxe de Fabien, mon cerveau a tendance à oublier des choses "implicites". :)


Oui, je l'ai fait et c'est quelque chose que je semble oublier beaucoup aussi - même si je suis beaucoup plus récent à cela que vous n'êtes donc alors que j'oublie une multitude de choses. :) Après avoir changé, j'ai toujours semblé avoir des problèmes avec cela, mais je crois que c'est parce que je vélo de vélo dans une liste. Pas sûr, mais j'ai essayé d'utiliser le .append en vain. :( Cependant, l'autre exemple fonctionne toujours bien et est explicite de ce que j'essaie d'obtenir, alors je l'aime. :) Merci encore pour l'aide! Très appréciée.



2
votes

En regardant votre code, fonctionnant avec des variables de position / d'emplacement, vous pouvez également unifier la position X, Y et Z dans un type commun, par exemple à l'aide de tuples nommés: xxx

juste un suggestion, cependant.


2 commentaires

Je n'avais pas pensé à faire quelque chose comme ça, mais je peux l'utiliser dans d'autres parties de mon code actuel, car cela semble un très bon moyen de diviser les choses, tout en ayant un sens.


Comment remplir de manière dynamique les emplacements d'objets?