set
是无序的数据结构。
不要使用set
,而是collections.OrderedDict
:
>>> a = collections.OrderedDict.fromkeys([1, 2, 20, 6, 210])
>>> b = collections.OrderedDict.fromkeys([6, 20, 1])
>>> collections.OrderedDict.fromkeys(x for x in a if x not in b)
OrderedDict([(2, None), (210, None)])
请注意,的顺序b无关紧要,因此它可以是可迭代的,但是应该是支持O(1)成员资格测试的可迭代。
编辑:上面的答案假定你希望能够对所有出现的集合执行(有序)设置操作,尤其是对先前设置操作的结果也是如此。如果没有必要,你可以简单地为某些集合使用列表,为其他集合使用集合,例如
>>> a = [1, 2, 20, 6, 210]
>>> b = set([6, 20, 1])
>>> [x for x in a if x not in b]
[2, 210]
这失去了的顺序b
,并不允许进行快速的成员资格测试a和结果。集允许快速成员资格测试,并且列表保持顺序。如果你需要在同一集合上同时使用这两项功能,请使用collections.OrderedDict
。