当我转换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
:
>>> 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
。
问题内容: 我正在尝试将一组转换为Python 2.6中的列表。我正在使用以下语法: 但是,我得到以下堆栈跟踪: 我怎样才能解决这个问题? 问题答案: 已经是清单了 你想要类似的东西吗 编辑:您的最后评论的输出 我想知道您是否做了这样的事情:
问题内容: 我不了解Python从保持集中应用的顺序。例如: 的顺序是。为什么“ A”在“ C”之前(可能是字母顺序)?为了保留添加顺序,我必须做什么? 问题答案: 您不能有订单集。而且没有办法告诉Python如何订购它。检查此答案以找到替代方法。
问题内容: 想象一下,我们有这段代码。 由于空间限制,我没有将hashCode()和equals()的代码放入其中,但这是从Eclipse生成的代码。 问题在于,在更改两个集合中的元素之前,这两个集合是相等的。更改它们的值(每个值都相同)后,尽管e1.hashCode()== e2.hashCode()和e1.equals(e2),但这些集合不再相等。 我猜想在比较两个HashSet时,Java使
用以下方法对物体进行成像:
问题内容: 我如何转换 至 问题答案: 使用简单的列表理解: 会给你:
我正在尝试将列表转换为元组。 Google上的大多数解决方案提供以下代码: 但是,当我运行代码时,它会产生一条错误消息: TypeError:“tuple”对象不可调用 我如何解决这个问题?