据我所知,你不能假设一个数据结构(比如字典)会按照你初始化的顺序保存其中的值。例如:
d = {1:10,2:20,3:30}
当您在for循环中打印它时,结果可能是:
{2:20,1:10,3:30}
为什么会发生这种情况--为什么字典(或其他数据结构)不能按特定顺序保存值?是不是只有字典才是真的?
发布于 2012-11-22 10:02:17
在Python内置类型中,字典和集合都是如此。列表和元组保持顺序。字典的有序版本有collections.OrderedDict
。对于其他类型(例如,没有内置到Python中的库中的类型),您只需阅读文档即可。在Python中,“数据结构”的作用没有通用规则。您必须查看每种类型的文档,以了解它定义了什么行为或没有定义什么行为。
Python确实定义了“序列”的概念,它被定义为具有顺序(列表和元组是序列)。字典是一个“映射”,它不需要有顺序。(有关更多信息,请参阅the Python glossary和the collections module。)
至于原因,这就是字典是如何实现的。基本上,如果它们不必跟踪顺序,那么它们可以更快,而且在许多情况下,您并不关心顺序,因此为了提高效率,它们被实现为无序集合。
发布于 2012-11-22 10:05:57
python中的dict
%s和set
%s都失去了顺序。这是因为它们是以哈希表的形式实现的,因此比起顺序保留,它们更关注更快的查找时间。
如果您正在寻找一种适合顺序保留的数据结构,那么您应该看看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)])
希望这能有所帮助
发布于 2012-11-22 10:04:07
是的,它只是字典。在下面,字典实际上并不按原样存储值,而是作为与值成对的键的hash。这允许非常快速的查找。列表和元组维护顺序。
https://stackoverflow.com/questions/13504885
复制相似问题