首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于其他列表的Nuke Python对象列表顺序

基于其他列表的Nuke Python对象列表顺序
EN

Stack Overflow用户
提问于 2016-10-11 20:59:46
回答 3查看 527关注 0票数 0

我有两份名单。第一个看起来像这样:

代码语言:javascript
复制
passOrder = [
                    'direct_diffuse',
                    'direct_specular',
                    'direct_specular_2',
                    'indirect_diffuse',
                    'indirect_specular',
                    'indirect_specular_2',
                    'refraction',
                    'reflection',
                    'emission',
                    'sss'
                ]

另一个是对象列表-在本例中为Nuke节点:

代码语言:javascript
复制
nodes = nuke.selectedNodes()

我尝试将每个节点的name参数与passOrder列表进行比较,并按照passOrder中给出的顺序排列它们。我试图显式地设置orderedNodes索引,但我猜当开始时列表为空时,这是不可能的。

代码语言:javascript
复制
orderedNodes = []
for n in nodes:
    for index, p in enumerate(passOrder):
        if n['name'].value() == p:
            orderedNodes.insert(index, n)

我还试图压缩这两个列表,并对它们进行排序--这里没有运气。基本上,我不知道如何在排序时遍历n['name'].value()组件。

EN

回答 3

Stack Overflow用户

发布于 2016-10-11 21:03:40

我不知道您的类/函数定义是什么样子,所以我使用这些存根来说明我的解决方案:

代码语言:javascript
复制
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进行排序:

代码语言:javascript
复制
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

结果:

代码语言:javascript
复制
[Node('direct_diffuse'), Node('refraction'), Node('emission')]
票数 2
EN

Stack Overflow用户

发布于 2016-10-11 21:09:43

您不必自己编写排序代码。

代码语言:javascript
复制
ordered_nodes = sorted(nodes, key=lambda n: passOrder.index(n["name"].value()) if n["name"].value() in passOrder else len(passOrder))
票数 1
EN

Stack Overflow用户

发布于 2016-10-11 21:09:24

您可以构建一个将节点名称映射到节点的字典,如下所示

代码语言:javascript
复制
nodes_by_name = {n['name'].value(): n for n in nodes}

使用这个字典,以所需的顺序检索节点是很容易的:

代码语言:javascript
复制
ordered_nodes = [nodes_by_name[name] for name in passOrder]

如果passOrder中可能存在没有对应节点的名称,您可以直接跳过它们:

代码语言:javascript
复制
ordered_nodes = [nodes_by_name[name] for name in passOrder if name in nodes_by_name]

这种方法比尝试使用排序更简单、更有效。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39977832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档