最近我注意到,当我转换一个列表来设置元素的顺序是改变的,并按字符排序。
想想这个例子:
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操作中非常好(这就是为什么你需要set,而不是list)。
如果您真的关心索引,只需将其保存为列表即可。如果您仍然想对许多列表中的元素执行set操作,最简单的方法是为每个具有相同键的列表创建一个字典,并创建一个list值,其中包含原始列表中键的所有索引。
def indx_dic(l):
dic = {}
for i in range(len(l)):
if l[i] in dic:
dic.get(l[i]).append(i)
else:
dic[l[i]] = [i]
return(dic)
a = [1,2,3,4,5,1,3,2]
set_a = set(a)
dic_a = indx_dic(a)
print(dic_a)
# {1: [0, 5], 2: [1, 7], 3: [2, 6], 4: [3], 5: [4]}
print(set_a)
# {1, 2, 3, 4, 5}
基于Sven的回答,我发现使用集合。OrderedDict像这样帮助我完成你想要的,并允许我添加更多的项目到dict:
import collections
x=[1,2,20,6,210]
z=collections.OrderedDict.fromkeys(x)
z
OrderedDict([(1, None), (2, None), (20, None), (6, None), (210, None)])
如果你想添加项目,但仍然把它当作一个集合,你可以这样做:
z['nextitem']=None
你可以在dict上执行类似z.keys()的操作并获得集合:
list(z.keys())
[1, 2, 20, 6, 210]
你可以用一行代码删除重复的值并保持插入的列表顺序,Python 3.8.2
mylist = ['b', 'b', 'a', 'd', 'd', 'c']
results = list({value:"" for value in mylist})
print(results)
>>> ['b', 'a', 'd', 'c']
results = list(dict.fromkeys(mylist))
print(results)
>>> ['b', 'a', 'd', 'c']
如果愿意,可以删除重复的值并保持插入的列表顺序
lst = [1,2,1,3]
new_lst = []
for num in lst :
if num not in new_lst :
new_lst.append(num)
# new_lst = [1,2,3]
如果你想要的是“order”,不要使用“sets”来删除重复,
使用集合进行搜索。
X在列表中
花费O(n)时间
在哪里
集合中的X
在大多数情况下需要O(1)时间*