根据我所知,您不能假定数据结构(如字典)将按照您初始化的顺序保存其中的值。 例如:Python数据结构顺序
d = {1:10,2:20,3:30}
当您打印这里面一个for循环,其结果可能是:
{2:20,1:10,3:30}
为什么会发生 - 为什么词典(或其他数据结构)将不会保留按特定顺序的值? 仅仅对字典才是真的吗?
根据我所知,您不能假定数据结构(如字典)将按照您初始化的顺序保存其中的值。 例如:Python数据结构顺序
d = {1:10,2:20,3:30}
当您打印这里面一个for循环,其结果可能是:
{2:20,1:10,3:30}
为什么会发生 - 为什么词典(或其他数据结构)将不会保留按特定顺序的值? 仅仅对字典才是真的吗?
在Python内建类型中,字典和集合都是如此。列表和元组保存顺序。订单版本的字典有collections.OrderedDict
。对于其他类型(例如,非Python内置的库),您只需阅读文档。对于“数据结构”在Python中做什么没有一般规则。您必须查看每种类型的文档以了解它所做或未定义的行为。
Python确实定义了“序列”的概念,它被定义为有序(列表和元组是序列)。字典是一个“映射”,它不需要有顺序。 (有关详细信息,请参见the Python glossary和the collections module)。
至于为什么,这是字典的实现方式。基本上,如果他们不需要跟踪订单,他们可以更快,并且在很多情况下,您不关心订单,因此他们被实现为无序集合以提高效率。
是的,它只是字典。在下面,字典实际上并不存储这些值,而是作为与该值配对的密钥的hash。这允许非常快速的查找。列表和元组维护秩序。
词典将命令他们的条目,使键搜索有效。如果你想保持你的密钥与他们添加的顺序相同,请尝试一个OrderedDict
。
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)])
希望这有助于
因为没有人真正解释了为什么'它happens'你的问题的一部分,http://www.laurentluce.com/posts/python-dictionary-implementation / – John