数据结构转换顺序从列表到集合

时间:2017-12-09 01:48:32

标签: python python-3.x list set

基本上,我定义了这个

nodes = ['Unix', 'BSD', 'Linux']

当我尝试这个时

print(set(nodes))

我期待它的结果

{'Unix', 'BSD', 'Linux'}

但我得到了这个

{'BSD', 'Linux', 'Unix'}

我不想破坏节点的顺序是否有好的方法呢?

2 个答案:

答案 0 :(得分:2)

SetsDictionaries 未订购,因为它们基于hash,因此根据输入的内容,hash值为计算将您的给定元素与键相关联。这就是为什么访问字典或集合的速度很快O(1),但如果您需要有序数据,则可能不是最佳选择。

所以你可能正试图通过创建一个集来摆脱重复?相反,您可以使用OrderedDict并访问keys以获取唯一列表。

from collections import OrderedDict


nodes = ['Unix', 'BSD', 'Linux']
uniques = OrderedDict((x, True) for x in nodes).keys()

答案 1 :(得分:1)

您有两种选择:

第一个选项:

使用有序的dict:

正如@ user1767754所建议的那样:

from collections import OrderedDict


nodes = ['Unix', 'BSD', 'Linux']
uniques = OrderedDict((x, True) for x in nodes).keys()

第二种方法跟踪索引和值:

所以首先用索引创建一个dict,值:

nodes = ['Unix', 'BSD', 'Linux']


order={}
for i,j in enumerate(nodes):
    order[i]=j

print(order)

它会给出:

{0: 'Unix', 1: 'BSD', 2: 'Linux'}

现在做你喜欢的事情,比如将列表转换为set或者你想要的任何内容,最后再转换为list,如下所示:

new=[]
for i in set(nodes):
    for k,j in order.items():
        if i==j:
            new.insert(k,j)

print(new)

现在它将给出:

['Unix', 'BSD', 'Linux']