从 random.sample 列表输入不同的属性值
Input to different attributes values from a random.sample list
所以这就是我正在尝试做的事情,我不确定为什么我是 python 的新手。我已经搜索了几个选项,但我不确定为什么这不起作用。
所以我在 Maya 中有 6 个不同的节点,称为 aiSwitch。我需要生成从 0 到 6 的随机不同数字,并将该值输入 aiSiwtch*.index.
总之结果应该是
aiSwitch1.index =(0到5的随机数)
aiSwitch2.index =(另一个从0到5的随机数,与之前的不同)
依此类推直到 aiSwitch6.index
我尝试了以下方法:
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)
这是我从打印中得到的结果:
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.
现在,每个 aiSwitch 都会发生这种情况,因为它当然处于循环中。随机数总是不同的列表,因为每次循环运行时都会发生。
那么问题出在哪里呢?
aiSwitch1.index = 1
所有其他 aiSwitch*.index 总是只采用列表中的最后一项,但我开始执行 setAttr 的时间。似乎 w 保留了 for 循环的最后一个值。我不太明白如何
获取0到5之间的随机值
在 aiSwitch1.index
中输入该值
获取另一个从0到6的随机值,与之前的不同
在 aiSwitch2.index
中输入该值
重复直到 aiSwitch5.index。
我确实让它可以使用以下形式:
allSwitch = mc.ls('aiSwitch')
for i in allSwitch:
mc.setAttr(i + '.index', random.uniform(0,5))
这给了所有aiSwitch*.index一个从0到5的随机数,但其中一些会重复。我认为这是有效的,因为每次循环运行时都会生成值,因此使用随机数设置属性。但数字重复,我试图避免这种情况。我也尝试了随机播放,但未能从中获取任何值。
我的主要错误似乎是我正在生成一个列表并对其进行采样,但我未能将该列表中的每个不同项目分配给不同的 aiSwitch*.index 节点。我 运行 对此一无所知。
任何线索将不胜感激。
谢谢。
乔纳森.
这是一种有点 Pythonic 的方式:打乱索引列表,然后使用 zip
对其进行迭代(这对于并行迭代结构很有用,这是您需要在此处执行的操作):
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)
所以这就是我正在尝试做的事情,我不确定为什么我是 python 的新手。我已经搜索了几个选项,但我不确定为什么这不起作用。
所以我在 Maya 中有 6 个不同的节点,称为 aiSwitch。我需要生成从 0 到 6 的随机不同数字,并将该值输入 aiSiwtch*.index.
总之结果应该是 aiSwitch1.index =(0到5的随机数) aiSwitch2.index =(另一个从0到5的随机数,与之前的不同) 依此类推直到 aiSwitch6.index
我尝试了以下方法:
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)
这是我从打印中得到的结果:
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.
现在,每个 aiSwitch 都会发生这种情况,因为它当然处于循环中。随机数总是不同的列表,因为每次循环运行时都会发生。
那么问题出在哪里呢?
aiSwitch1.index = 1
所有其他 aiSwitch*.index 总是只采用列表中的最后一项,但我开始执行 setAttr 的时间。似乎 w 保留了 for 循环的最后一个值。我不太明白如何
获取0到5之间的随机值
在 aiSwitch1.index
中输入该值
获取另一个从0到6的随机值,与之前的不同
在 aiSwitch2.index
中输入该值
重复直到 aiSwitch5.index。
我确实让它可以使用以下形式:
allSwitch = mc.ls('aiSwitch')
for i in allSwitch:
mc.setAttr(i + '.index', random.uniform(0,5))
这给了所有aiSwitch*.index一个从0到5的随机数,但其中一些会重复。我认为这是有效的,因为每次循环运行时都会生成值,因此使用随机数设置属性。但数字重复,我试图避免这种情况。我也尝试了随机播放,但未能从中获取任何值。
我的主要错误似乎是我正在生成一个列表并对其进行采样,但我未能将该列表中的每个不同项目分配给不同的 aiSwitch*.index 节点。我 运行 对此一无所知。
任何线索将不胜感激。 谢谢。 乔纳森.
这是一种有点 Pythonic 的方式:打乱索引列表,然后使用 zip
对其进行迭代(这对于并行迭代结构很有用,这是您需要在此处执行的操作):
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)