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

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

最近,我注意到当我转换一个listset元素的顺序被更改,并按字符进行排序。

考虑这个例子:

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

我的问题是-

  1. 为什么会发生这种事?
  2. 如何在不丢失初始订单的情况下设置操作(特别是设置差异)?


慕哥6287543
浏览 617回答 3
3回答

牧羊人nacy

A 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)成员资格测试。编辑上面的答案假设您希望能够对所有正在发生的集合执行(有序)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.

慕勒3428872

是Python 2和3还有另一种解决方案:>>> x = [1, 2, 20, 6, 210]>>> sorted(set(x), key=x.index)[1, 2, 20, 6, 210]

有只小跳蛙

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

相关分类

Python