在两个列表之间获得差异的问题

时间:2014-11-21 10:46:55

标签: python maya

我试图找到两个列表之间的区别 - charLs和rigLs,但是当我尝试使用列表并设置我在网上找到的方法时,它给了我非常不同的结果。

在下面的例子中,我应该在diff1结果中看到female01和elderly01但是我得到了male01 即使在我转换到集合时,就像在diff2中一样,这一次它给出了场景中3个装备的列表。

尝试了list(set(..)^set(..))并使用了difference以及类似[x for x in rigLs if x not in charLs]之类的内容,但仍无效。

不确定这是否是因为使用内部模块创建的装备(|SceneGrp|characterRig下的装备)以及涉及listRelatives的部分正在发出问题

我可以通过其他方式获得差异吗?

pubObj = cmds.ls(type = "publishedRef")
rigLs = []
for item in pubObj:
    nameSplit = item.split(':')
    rigLs.append(nameSplit[0])

grpNode = cmds.ls("SceneGrp", type=grpNode.name())
check = cmds.objExists("|SceneGrp|characterRig")
charLs = cmds.listRelatives("|SceneGrp|characterRig", c=True)

# Assumingly the following are the items appended into the list
# rigLs : [u'male01', u'female01', u'elderly01']
# charLs :[u'male01']

diff1 = list(set(charLs)-set(rigLs))
# Results : [u'male01']

diff2 = list(set(rigLs)-set(charLs))
# Results : [u'male01', u'female01', u'elderly01']

1 个答案:

答案 0 :(得分:0)

以下略有优化,以便我们只在第二个列表的元素上创建一次

In [64]: l1 = [0,1,2,3,4,5,6,7,8,9]
In [65]: l2 = [8,3,6]
In [66]: [elt for l2s in [set(l2)] for elt in l1 if elt not in l2s]
Out[66]: [0, 1, 2, 4, 5, 7, 9]
In [67]: 

执行相同操作的功能

def l1_minus_l2(l1, l2):
    return [elt for l2s in [set(l2)] for elt in l1 if elt not in l2s]

如果您更喜欢返回迭代器

def l1_minus_l2(l1, l2):
    return (elt for l2s in [set(l2)] for elt in l1 if elt not in l2s)