我有两份名单。第一个看起来像这样:
passOrder = [
'direct_diffuse',
'direct_specular',
'direct_specular_2',
'indirect_diffuse',
'indirect_specular',
'indirect_specular_2',
'refraction',
'reflection',
'emission',
'sss'
]另一个是对象列表-在本例中为Nuke节点:
nodes = nuke.selectedNodes()我尝试将每个节点的name参数与passOrder列表进行比较,并按照passOrder中给出的顺序排列它们。我试图显式地设置orderedNodes索引,但我猜当开始时列表为空时,这是不可能的。
orderedNodes = []
for n in nodes:
for index, p in enumerate(passOrder):
if n['name'].value() == p:
orderedNodes.insert(index, n)我还试图压缩这两个列表,并对它们进行排序--这里没有运气。基本上,我不知道如何在排序时遍历n['name'].value()组件。
发布于 2016-10-11 21:03:40
我不知道您的类/函数定义是什么样子,所以我使用这些存根来说明我的解决方案:
class Thing:
def __init__(self, value):
self.val = value
def value(self):
return self.val
class Nuke:
def __init__(self, name):
self.n = {"name": Thing(name)}
def __repr__(self):
return "Node({})".format(repr(self.n["name".value()))
def selectedNodes():
return [Nuke("refraction"), Nuke("direct_diffuse"), Nuke("emission")]您可以使用passOrder.index作为其关键参数来对nodes进行排序:
passOrder = [
'direct_diffuse',
'direct_specular',
'direct_specular_2',
'indirect_diffuse',
'indirect_specular',
'indirect_specular_2',
'refraction',
'reflection',
'emission',
'sss'
]
nodes = selectedNodes()
nodes.sort(key=lambda item: passOrder.index(item.n["name"].value()))
print nodes结果:
[Node('direct_diffuse'), Node('refraction'), Node('emission')]发布于 2016-10-11 21:09:43
您不必自己编写排序代码。
ordered_nodes = sorted(nodes, key=lambda n: passOrder.index(n["name"].value()) if n["name"].value() in passOrder else len(passOrder))发布于 2016-10-11 21:09:24
您可以构建一个将节点名称映射到节点的字典,如下所示
nodes_by_name = {n['name'].value(): n for n in nodes}使用这个字典,以所需的顺序检索节点是很容易的:
ordered_nodes = [nodes_by_name[name] for name in passOrder]如果passOrder中可能存在没有对应节点的名称,您可以直接跳过它们:
ordered_nodes = [nodes_by_name[name] for name in passOrder if name in nodes_by_name]这种方法比尝试使用排序更简单、更有效。
https://stackoverflow.com/questions/39977832
复制相似问题