我有一本按照特定顺序声明的字典,并希望一直保持该顺序。keys/values
实际上不能根据它们的值按顺序保留,我只希望按声明的顺序保留。
因此,如果我有字典:
d = {'ac': 33, 'gw': 20, 'ap': 102, 'za': 321, 'bs': 10}
如果我查看它或遍历它,则不是按此顺序进行的,有什么方法可以确保Python保持我声明键/值的显式顺序?
从Python 3.6开始,标准dict
类型默认会保留插入顺序。
d = {'ac':33, 'gw':20, 'ap':102, 'za':321, 'bs':10}
将产生字典,字典中的键按源代码中列出的顺序排列。
这是通过对稀疏哈希表使用带有整数的简单数组来实现的,其中这些整数索引到另一个存储键-值对(加上计算得出的哈希)的数组中。后一个数组恰好按插入顺序存储项目,实际上,整个组合使用的内存少于Python 3.5及之前版本中使用的实现。有关详细信息,请参阅Raymond Hettinger
的原始想法帖子。
在3.6中,这仍被视为实现细节;请参阅Python 3.6文档的新增功能:
此新实现的顺序保留方面被认为是实现细节,因此不应依赖(将来可能会更改,但是希望在更改语言规范之前,先在几个发行版中使用该新dict
实现该语言,为所有当前和将来的Python实现强制要求保留顺序的语义;这还有助于保留与仍旧有效的随机迭代顺序的旧版本语言(例如Python 3.5)的向后兼容性。
Python 3.7将此实现细节提升为语言规范,因此现在必须dict
保留与该版本或更高版本兼容的所有Python实现中的顺序。参见BDFL的声明。
问题内容: 看起来字典的和方法返回的列表始终是一对一映射(假设在调用这两种方法之间字典没有改变)。 例如: 如果你没有在调用keys()和调用之间更改字典values(),那么假设上述for循环将始终显示True是否错误?我找不到任何证明文件。 问题答案: 发现了这一点: 如果,, ,和 被称为中间没有修改的字典,列表会直接对应。 在2.x文档和3.x文档上。
问题内容: 我想将一个键,值对添加到哈希表(或任何其他集合)中,但必须保持插入顺序。我怎样才能做到这一点? 就像我将1作为键“ 1”添加为值,将2作为键并将“ 2”添加为值。 输出应为: 问题答案: 以下是一些重要实现的特征差异: :“具有可预测的迭代顺序,通常是将键插入映射 的顺序 ( 插入顺序 )。” :“不保证地图的顺序” :“根据其键的自然顺序或按” 即是一个 因此,在这种情况下,您需要的
问题内容: 我正在尝试创建一个OrderedDict对象,但我不会立即创建它,否则所有元素都会混乱。 这是我的工作: 元素不按我分配的顺序排列 docs.python.org没有示例,我无法弄清楚订单为何变得混乱。任何帮助是极大的赞赏。 问题答案: 您的问题是,您正在构造一个将初始数据提供给的-这 不会 存储任何订单,因此订单在到达之前就丢失了。 解决方案是从有序数据类型构建-最简单的是的: 值得
问题 怎样在一个序列上面保持元素顺序的同时消除重复的值? 解决方案 如果序列上的值都是 hashable 类型,那么可以很简单的利用集合或者生成器来解决这个问题。比如: def dedupe(items): seen = set() for item in items: if item not in seen: yield item
问题内容: 以下SQL查询: 返回: 要添加一次,只需添加一次即可: 但是,结果值改变了顺序: 可能是什么原因呢? 我如何保留订单? 问题答案: 该关键字是做什么它应该做的事情,回报每一个行与给定的列值。不同不允许您指定 哪些 这样的行会被退回,这是从原来的查询,这样的排序是允许清楚(存在一个跟随ID为429的行ID为443行)。 要控制将返回哪些行,您需要重新构造查询。我将采用的典型解决方案是使
问题内容: 使用SELECT WHERE IN()时,是否可以保持顺序?例如,使用以下查询: 结果将使用ID的默认顺序返回。1,7,54,55,56 当我想保留IN中使用的顺序时:56,55,54,1,7 有没有一种快速的方法可以在MySQL中执行此操作,或者我将被迫在代码后对其进行排序? 问题答案: 使用FIND_IN_SET: