当我转换list到set元素的顺序发生变化,由字符排序。
list
set
考虑以下示例:
x=[1,2,20,6,210] print x # [1, 2, 20, 6, 210] # the order is same as initial order set(x) # set([1, 2, 20, 210, 6]) # in the set(x) output order is sorted
我的问题是
为什么会这样呢? 如何进行设置操作(尤其是“设置差异”)而不丢失初始顺序?
set是无序的数据结构。
不要使用set,而是collections.OrderedDict:
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。
b