为了账号安全,请及时绑定邮箱和手机立即绑定

将列表转换为一组更改元素顺序

将列表转换为一组更改元素顺序

慕哥6287543 2019-06-19 14:36:16
将列表转换为一组更改元素顺序最近,我注意到当我转换一个list到set元素的顺序被更改,并按字符进行排序。考虑这个例子:x=[1,2,20,6,210]print x  # [1, 2, 20, 6, 210] # the order is same as initial orderset(x)# set([1, 2, 20, 210, 6]) # in the set(x) output order is sorted我的问题是-为什么会发生这种事?如何在不丢失初始订单的情况下设置操作(特别是设置差异)?
查看完整描述

3 回答

?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

  1. set是无序的数据结构。

  2. 不要使用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)成员资格测试。

编辑上面的答案假设您希望能够对所有正在发生的集合执行(有序)SET操作,特别是对前一个SET操作的结果。如果这不是必要的话,您可以简单地为一些集合使用列表,为另一些集合进行设置。

>>> 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.


查看完整回答
反对 回复 2019-06-19
?
慕勒3428872

TA贡献1848条经验 获得超6个赞

Python 2和3还有另一种解决方案:

>>> x = [1, 2, 20, 6, 210]>>> sorted(set(x), key=x.index)[1, 2, 20, 6, 210]


查看完整回答
反对 回复 2019-06-19
?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

在回答第一个问题时,SET是为SET操作优化的数据结构。就像一个数学集合,它不强制或维持元素的任何特定顺序。集合的抽象概念不强制执行顺序,因此不需要实现。当您从一个列表创建一个集合时,Python可以根据它对一个集合使用的内部实现的需要更改元素的顺序,这样就能够高效地执行SET操作。


查看完整回答
反对 回复 2019-06-19
  • 3 回答
  • 0 关注
  • 616 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信