根据我所知道的,您不能假设数据结构(例如字典)会将其中的值保存在与您初始化它的顺序相同的顺序上。例如:
d = {1:10,2:20,3:30}
当您在 for 循环中打印它时,结果可能是:
{2:20,1:10,3:30}
为什么会发生 - 为什么字典(或其他数据结构)不会按特定顺序保留值?仅适用于字典吗?
根据我所知道的,您不能假设数据结构(例如字典)会将其中的值保存在与您初始化它的顺序相同的顺序上。例如:
d = {1:10,2:20,3:30}
当您在 for 循环中打印它时,结果可能是:
{2:20,1:10,3:30}
为什么会发生 - 为什么字典(或其他数据结构)不会按特定顺序保留值?仅适用于字典吗?
在 Python 内置类型中,字典和集合都是如此。列表和元组保持顺序。有collections.OrderedDict
一个有序版本的字典。对于其他类型(例如,来自未内置于 Python 的库中的类型),您只需阅读文档即可。Python 中“数据结构”的作用没有通用规则。您必须查看每种类型的文档以了解它定义或未定义的行为。
Python 确实定义了“序列”的概念,它被定义为具有顺序(列表和元组是序列)。字典是一种“映射”,不需要顺序。(有关更多信息,请参阅Python 词汇表和集合模块。)
至于为什么,这就是字典的实现方式。基本上,如果它们不必跟踪顺序,它们可以更快,并且在许多情况下您不关心顺序,因此它们被实现为无序集合以提高效率。
dict
python 中的 s 和s都set
失去了顺序。这是因为它们被实现为哈希表,因此更关心更快的查找时间而不是订单保存。
如果您正在寻找一种面向顺序保留的数据结构,那么您应该查看list
s. 在您的情况下,您可以使用如下元组列表:
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)])
希望这可以帮助
是的,它只是字典。在下面,字典实际上并没有按原样存储值,而是作为与值配对的键的哈希值。这允许非常快速的查找。列表和元组保持顺序。
字典将对它们的条目进行排序,以使搜索键更有效。如果您想保持您的密钥与添加它们的顺序相同,请尝试使用OrderedDict
.