0

根据我所知道的,您不能假设数据结构(例如字典)会将其中的值保存在与您初始化它的顺序相同的顺序上。例如:

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

当您在 for 循环中打印它时,结果可能是:

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

为什么会发生 - 为什么字典(或其他数据结构)不会按特定顺序保留值?仅适用于字典吗?

4

4 回答 4

1

在 Python 内置类型中,字典和集合都是如此。列表和元组保持顺序。有collections.OrderedDict一个有序版本的字典。对于其他类型(例如,来自未内置于 Python 的库中的类型),您只需阅读文档即可。Python 中“数据结构”的作用没有通用规则。您必须查看每种类型的文档以了解它定义或未定义的行为。

Python 确实定义了“序列”的概念,它被定义为具有顺序(列表和元组是序列)。字典是一种“映射”,不需要顺序。(有关更多信息,请参阅Python 词汇表集合模块。)

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

于 2012-11-22T02:02:16.507 回答
1

dictpython 中的 s 和s都set失去了顺序。这是因为它们被实现为哈希表,因此更关心更快的查找时间而不是订单保存。

如果您正在寻找一种面向顺序保留的数据结构,那么您应该查看lists. 在您的情况下,您可以使用如下元组列表:

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-22T02:05:56.730 回答
0

是的,它只是字典。在下面,字典实际上并没有按原样存储值,而是作为与值配对的键的哈希值。这允许非常快速的查找。列表和元组保持顺序。

于 2012-11-22T02:04:07.423 回答
0

字典将对它们的条目进行排序,以使搜索键更有效。如果您想保持您的密钥与添加它们的顺序相同,请尝试使用OrderedDict.

于 2012-11-22T02:04:32.663 回答