在b中为a创建一个带有基本python循环的列表:

时间:2018-03-05 11:22:11

标签: maya

我正在尝试在python中创建一个列表,其中包含我在Autodesk Maya中选择的元素。但是,当我选择多个元素时,此元素会重复。我认为这是一个非常简单的问题,因为我没有正确循环,然后一个键被多次添加到我的列表中。 如果有更多知识的人可以看看并给我一些建议会很棒! 非常感谢,

items = []
selectedObjects = cmds.ls(sl=True)
strItems = []
for item in selectedObjects:
    b = item.encode('utf-8')
    strItems.append(b)
    for item1 in strItems:
        lenItem = len(item1)
        lenItemNoGrp = lenItem - 5
        lenItemNoGrp2 = lenItem - 6
        grp = item1[lenItemNoGrp:lenItem]
        grp2 = item1[0:lenItemNoGrp2]
        grpName = grp2
        if grp == 'group':
            items.append({
                "type": "maya_file",
                "name": shotName + 'V' + versionStr + grpName,
            })
        else:
            None

2 个答案:

答案 0 :(得分:0)

每次添加内容时,都会循环遍历strItem的完整内容。假设您选择了obj1和obj2。然后

  • obj1已添加到列表
  • 第二个循环使用obj1并使用它执行某些操作
  • 外圈再次出现并将obj2添加到列表中
  • 内部循环再次获取列表的所有内容,首先采用obj1然后采用obj2

因此,在这种情况下,迭代canging list可能不是你想要做的。

答案 1 :(得分:0)

看起来你意外缩进了循环。此版本仍然缺少变量shotNameversionString,但它不会复制内容

items = [] 
selectedObjects = cmds.ls(sl=True) 
strItems = [] 

for item in selectedObjects:
    b = item.encode('utf-8')
    strItems.append(b) 

for item1 in strItems:
    lenItem = len(item1)
    lenItemNoGrp = lenItem - 5
    lenItemNoGrp2 = lenItem - 6
    grp = item1[lenItemNoGrp:lenItem]
    grp2 = item1[0:lenItemNoGrp2]
    grpName = grp2
    if grp == 'group':
        items.append({
            "type": "maya_file",
            "name": shotName + 'V' + versionStr + grpName,
        })

但是,您可以通过多种方式简化此操作。

  1. 您可以使用列表推导进行utf-8转换
  2. 您还可以使用endswith
  3. 找到以“群组”结尾的项目
  4. 您可以使用否定切片来获取字符串的其余部分而不使用“group”
  5. 这会让你失望:

    group_nodes = [item.encode('utf-8') for item in cmds.ls(sl=True) if item.endswith('group')]
    entries = [{ 
                 'type':'maya_file', 
                 'name': "{0}V{1}{2}".format(shotName, versionStr, entry[:-5])
                } 
               for entry in group_nodes]