2012-11-22 108 views
0

根据我所知,您不能假定数据结构(如字典)将按照您初始化的顺序保存其中的值。 例如:Python数据结构顺序

d = {1:10,2:20,3:30} 

当您打印这里面一个for循环,其结果可能是:

{2:20,1:10,3:30} 

为什么会发生 - 为什么词典(或其他数据结构)将不会保留按特定顺序的值? 仅仅对字典才是真的吗?

+2

因为没有人真正解释了为什么'它happens'你的问题的一部分,http://www.laurentluce.com/posts/python-dictionary-implementation / – John

回答

1

在Python内建类型中,字典和集合都是如此。列表和元组保存顺序。订单版本的字典有collections.OrderedDict。对于其他类型(例如,非Python内置的库),您只需阅读文档。对于“数据结构”在Python中做什么没有一般规则。您必须查看每种类型的文档以了解它所做或未定义的行为。

Python确实定义了“序列”的概念,它被定义为有序(列表和元组是序列)。字典是一个“映射”,它不需要有顺序。 (有关详细信息,请参见the Python glossarythe collections module)。

至于为什么,这是字典的实现方式。基本上,如果他们不需要跟踪订单,他们可以更快,并且在很多情况下,您不关心订单,因此他们被实现为无序集合以提高效率。

0

是的,它只是字典。在下面,字典实际上并不存储这些值,而是作为与该值配对的密钥的hash。这允许非常快速的查找。列表和元组维护秩序。

0

词典将命令他们的条目,使键搜索有效。如果你想保持你的密钥与他们添加的顺序相同,请尝试一个OrderedDict

1

dict s和set s in python lost order。这是因为它们被实现为散列表,因此更关心快速查找时间而不是保存订单。

如果您正在寻找一个适合订单保存的数据结构,那么您应该查看list。在你的情况,你可以使用元组的列表如下:

In [255]: L = [] 

In [256]: L.append((1,10)) 

In [257]: L.append((2,20)) 

In [258]: L.append((3,30)) 

In [259]: L 
Out[259]: [(1, 10), (2, 20), (3, 30)] 

但是,如果你想维持秩序希望获得更快的查找时间比list所提供的,那么你很可能更好与OrderedDict

In [265]: d = collections.OrderedDict() 

In [266]: d[1]=10 

In [267]: d 
Out[267]: OrderedDict([(1, 10)]) 

In [268]: d[2]=20 

In [269]: d 
Out[269]: OrderedDict([(1, 10), (2, 20)]) 

In [270]: d[3]=30 

In [271]: d 
Out[271]: OrderedDict([(1, 10), (2, 20), (3, 30)]) 

希望这有助于