迭代字典按排序顺序返回键

2024-05-18

我有一个关于 python 如何处理字典中的数据的问题。假设我有一个简单的字典,其中一个数字作为键,一个数字作为值,如下所示:

a = { 5: 3, 20: 1, 1: 1, 5: 2, 100: 3, 11: 6,
     14: 1, 15: 2, 16: 4, 17: 2, 25: 1, 19: 1 }

我想遍历这本字典并打印出键。每次我循环遍历字典(如下所示)时,它都会按升序打印键。

这就是我想要它做的,但我想知道,据我所知,为什么会发生这种情况?可以自动排序每次都按递增顺序吗?正如您在上面的字典中看到的,键显然不是按升序排列的,但下面的输出按升序打印它们。

我只是想获得一个清晰的理解,任何帮助将不胜感激。谢谢

Example

for i in a:
    print i

Output:

1
5
11
14
15
16
17
19
20
25
100

字典中的整数并不总是按键排序:

a = {2:0, 9:0}
print a.keys()  # [9, 2]

Python 字典是哈希表 http://en.wikipedia.org/wiki/Hash_table,这是一种特殊的数组,其中index您存储的单元格的value是应用一个特殊函数导出的(我们称之为hash函数)上key。 这样如果你想检索value对于一个特定的key你可以再次计算hash的功能key,这将返回与之前相同的结果,获取索引所在的位置value被储存了。

The hash函数转换most https://docs.python.org/2/glossary.html#term-hashable数据类型转换为整数:

print hash(1)             # 1
print hash('hello')       # 840651671246116861
print hash((2,3))         # 3713082714463740756

每种类型都可以定义自己的计算方式hash and int usually返回自身:

print hash(1)             # 1
print hash(20)            # 20
print hash(1000)          # 1000

正如你所看到的,数字很快就会变大,我们不希望有一个数组840651671246116861单元格只是为了保存字符串hello。 为了避免这个问题,我们可以创建一个数组n元素,然后使用剩余的hash除以n as the index.

例如,如果我们想找到索引hello在一个数组中8要素:

print hash('hello') % 8   # 5

所以我们的字典会知道value对于钥匙hello位于索引处8。这就是字典的实现方式。

So, why {2:0, 9:0}不是在钥匙上订购的吗?那是因为 python 字典是用创建的8元素,并根据需要增长(更多关于这个here https://stackoverflow.com/questions/327311/how-are-pythons-built-in-dictionaries-implemented).

让我们计算存储数据的索引key = 2 and key = 9在字典中与n = 8:

print hash(2) % 8         # 2  [hash(2) = 2 and 2 % 8 = 2]
print hash(9) % 8         # 1  [hash(9) = 9 and 9 % 8 = 1]

这意味着array包含字典数据的将是:

| index | key | value |
|-------|-----|-------|
|   0   |     |       |
|   1   |  9  |   0   |
|   2   |  2  |   0   |
|   3   |     |       |
|   4   |     |       |
|   5   |     |       |
|   6   |     |       |
|   7   |     |       |

当迭代它时,顺序将是该表示中呈现的顺序,因此9将在之前2.

您可以阅读有关该主题的更多信息here http://www.laurentluce.com/posts/python-dictionary-implementation/.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

迭代字典按排序顺序返回键 的相关文章

随机推荐

  • 如何根据服务器响应而不是HTTP 500触发 jquery.ajax() 错误回调?

    通过使用 jquery ajax 函数 我可以执行以下操作 ajax url url type GET async true dataType json data data success function data Handle serv
  • 来自 joda-time DateTimeFormatter 的模式字符串?

    是否可以从 joda time DateTimeFormatter 获取模式字符串 DateTimeFormatter formatter DateTimeFormat forPattern yyyyMMdd String original
  • 如何在 Symfony DateType 字段中设置日期范围?

    我需要在表单中的 dateType 字段的最小和最大日期上设置范围 我的代码在这里 public function buildForm FormBuilderInterface builder array options builder g
  • Angular JS 中的数组

    我是 Angular JS 新手 我正在将元素推送到数组中 然后想使用 ng repeat 在 html 中显示 scope groupedMedia Adding elements through a for loop scope gro
  • .Net 中是否有与 HTML 等效的 XmlReader?

    我用过Html敏捷包 http html agility pack net z codeplex过去在 Net 中解析 HTML 但我不喜欢它只使用 DOM 模型 在大型文档和 或具有大量嵌套的文档上 可能会遇到堆栈溢出或内存不足异常 另外
  • NextjS src 和默认外部图像 URL 的图像问题

    我正在使用最新版本的 NextJS 10 0 9 我有一个想要显示的图像 但是收到错误 Error Image with src https picsum photos 480 270 must use width and height p
  • 从 websocket 发送数据到 socket.io

    我使用 websocket 接口连接到 websocket 服务器 如果我想将通过 websocket 接口从 websocket 服务器接收到的数据发送到通过 http 服务器连接到我的客户端 我应该使用 socket io 吗 所以最后
  • Javascript - deepEqual 比较

    问题 来自 Eloquent Javascript 第二版 第 4 章 练习 4 编写一个函数 deepEqual 它接受两个值 并且仅当它们相等时才返回 true 是相同的值或具有相同属性的对象 其值也是 与对 deepEqual 的递归
  • 可以重复应用并产生相同结果的数据库操作吗?

    我现在一片空白 或者像有些人说的那样 正在经历一个高级时刻 我知道这个概念有一个正式的定义和名称 其中在数据库中运行的数据库操作 存储过程 如果重复运行将产生相同的结果 它属于数学家的自反 对称 传递等类型 您的意思是 确定性 吗 如果使用
  • 如何将 discord.py help 命令放入嵌入中?

    因此 我目前有一个使用 Discord py 运行的 Discord 机器人 正如您所知 discord py 带有自己的帮助命令 所以我不必自己制作 它非常有用 我将命令分为齿轮 类别 它确实有助于简化 因为现在我不必编写自己的帮助命令
  • 调用高阶组件时在 React 中访问类外部的 prop

    我正在尝试使用高阶组件 HOC 模式来重用一些连接到状态并使用 Redux Form formValueSelector 方法的代码 formValueSelector 需要一个引用表单名称的字符串 我想动态地设置它 并且每当我需要项目的值
  • 使用 WebServiceContext 测试 @Webservice EJB(使用 OpenEJB?)

    我有一些 EJB 作为 JAX WS Web 服务 WebService Stateless Remote MobileFacade class public class MobileFacadeBean implements Mobile
  • 如何删除 Sql Server 2005 中存在的临时 SP

    我的问题很简单 如何删除临时存储过程 如果存在 这是因为当我在脚本中创建临时 SP 时 它会在第二次运行时抛出类似 数据库中已存在名为 sp name 的对象 的错误 我不想向用户显示此消息 请帮我 您的解决方案受到高度赞赏 临时进程的删除
  • 仅将 pandas df 的前 N ​​行写入 csv

    如何仅将前 N 行或从 P 到 Q 行从 pandas 数据帧写入 csv 而不首先对 df 进行子集化 由于内存问题 我无法对要导出的数据进行子集化 我正在考虑一个逐行写入 csv 的函数 谢谢 Use head https pandas
  • 如何使用基于时间的触发器每小时运行一个脚本,仅在工作日的整点运行?

    我只需要在工作日每小时运行一个 Google App Script 脚本 两者之一似乎很容易做到 但将其结合起来我不确定 每小时触发 ScriptApp newTrigger RefreshRates timeBased inTimezon
  • 使用一个 apk 安装两个应用程序

    我有 2 个应用程序 1 内容提供者 2 使用此 ContentProvider 的应用程序 我需要使用单个 apk 文件安装这 2 个应用程序 我想在 Eclipse 中同时推送这两个应用程序 如果我将另一个项目添加到一个应用程序的构建路
  • 让协程等待之前的调用

    我还没有完全掌握 Kotlin 协程 基本上我希望协程在执行之前等待任何先前的调用完成 下面的代码似乎可以工作 但它正在做我认为它正在做的事情吗 private var saveJob Job null fun save saveJob s
  • Java递归方法求阶乘返回负输出[重复]

    这个问题在这里已经有答案了 我知道这是溢出 但问题是 20 是相对较小的数字 这不应该发生 对吧 有没有更好的方法来查找大数 例如 1000 的阶乘 而不会得到这种奇怪的结果 public class RecursiveFunctionsE
  • 更新序列化器时,嵌套序列化器没有实例(many = true)

    我有 UserSerializer 和嵌套的 UserClientSerializer 我正在尝试更新已登录用户的信息 但我收到 unique together 验证错误 我有以下型号 模型 py class UserClients mod
  • 迭代字典按排序顺序返回键

    我有一个关于 python 如何处理字典中的数据的问题 假设我有一个简单的字典 其中一个数字作为键 一个数字作为值 如下所示 a 5 3 20 1 1 1 5 2 100 3 11 6 14 1 15 2 16 4 17 2 25 1 19