2017-08-16 4 views
1

donc c'est ce que j'essaie de faire, et je ne suis pas sûr de savoir comment je suis nouveau à python. J'ai cherché quelques options et je ne sais pas pourquoi cela ne fonctionne pas.Entrez des valeurs d'attributs différentes à partir d'une liste random.sample

J'ai donc 6 nœuds différents, en maya, appelés aiSwitch. J'ai besoin de générer des nombres différents aléatoires de 0 à 6 et d'entrer cette valeur dans aiSiwtch * .index.

En bref, le résultat devrait être aiSwitch1.index = (nombre aléatoire de 0 à 5) aiSwitch2.index = (un autre nombre aléatoire de 0 à 5 différent de celui avant) Et ainsi de suite unil aiSwitch6.index

J'ai essayé les suivantes:

import maya.cmds as mc 
import random 

allswtich = mc.ls('aiSwitch*') 
    for i in allswitch: 
    print i 
    S = range(0,6) 
    print S 
    shuffle = random.sample(S, len(S)) 
    print shuffle 
    for w in shuffle: 
     print w 
     mc.setAttr(i + '.index', w) 

Ceci est le résultat que je reçois des impressions:

aiSwitch1 <-- from print i 
[0,1,2,3,4,5] <--- from print S 
[2,3,5,4,0,1] <--- from print Shuffle (random.sample results) 
2 
3 
5 
4 
0 
1 <--- from print w, every separated item in the random.sample list. 

Maintenant, cela se produit pour chaque aiSwitch, parce que c'est dans une boucle bien sûr. Et les nombres aléatoires sont toujours une liste différente car cela arrive chaque fois que la boucle s'exécute.

Alors, où est le problème?

aiSwitch1.index = 1 

Et tous les autres aiSwitch * .index toujours prendre seul le dernier élément de la liste, mais le temps que je dois faire le setattr. Il semble que w conserve la dernière valeur de la boucle for. Je ne comprends pas tout à fait comment

  1. Obtenez une valeur aléatoire de 0 à 5

  2. entrée cette valeur dans aiSwitch1.index

  3. Obtenez une autre valeur aléatoire de 0 à 6 différent la précédente

  4. Input cette valeur dans aiSwitch2.index

  5. Répéter jusqu'à aiSwitch 5.index.

J'ai eu à travailler avec la forme suivante:

allSwitch = mc.ls('aiSwitch') 
for i in allSwitch: 
    mc.setAttr(i + '.index', random.uniform(0,5)) 

Cela a donné un nombre aléatoire de 0 à 5 à tous aiSwitch * .index, mais certains d'entre eux répéter. Je pense que cela fonctionne parce que la valeur est générée à chaque fois que la boucle s'exécute, définissant ainsi l'attribut avec un nombre aléatoire. Mais les chiffres se répètent et j'essayais d'éviter cela. J'ai également essayé un shuffle mais n'ai pas réussi à obtenir des valeurs.

Ma principale erreur semble être de générer une liste et de l'échantillonner, mais je ne parviens pas à assigner tous les éléments différents de cette liste à différents nœuds aiSwitch * .index. Et je manque d'idées pour ça.

Tous les indices seraient grandement appréciés. Merci. Jonathan.

+0

Indice: 'random.shuffle' la liste' [0,1,2,3,4,5] ' –

+0

Salut! Merci pour l'indice. Voulez-vous ajouter ce mélange dans la dernière structure de code? Merci encore! – Jonathan

+0

Mélangez simplement la liste une fois pour toutes avant de faire quoi que ce soit d'autre, puis faites simplement défiler les valeurs mélangées, en les utilisant au besoin. –

Répondre

1

Voici une manière un peu Pythonic: lecture aléatoire la liste des indices, itérer alors dessus à l'aide zip (qui est utile pour itérer sur des structures en parallèle, ce qui est ce que vous devez faire ici):

import random 

index = list(range(6)) 
random.shuffle(index) 

allSwitch = mc.ls('aiSwitch*') 
for i,j in zip(allSwitch,index): 
    mc.setAttr(i + '.index', j) 
+0

En effet cela fonctionne! Merci beaucoup l'homme. La seule chose qui manque dans le code est le * après le aiSwitch (juste dire que si quelqu'un d'autre essaie de modifier ce code pour ses propres besoins). On dirait que la fonction zip est ce dont j'avais besoin. Vraiment apprécier votre aide. Merci! – Jonathan

+0

@Jonathan Je quittais votre extrait de code au bas de la question, même si je vais le modifier maintenant. Vous pouvez toujours marquer la réponse comme «acceptée» si elle répond correctement à la question. –

+0

Fait! Merci encore John! – Jonathan