职业发展

Python

如何看待某国内大公司Python面试题,有关dict中初始化为固定值?

阅读下面的代码,写出A0,A1至A6的最终值。

A0 = dict(zip(('a','b','c','d','e'),(1,2,3,4,5)))

A1 = range(10)

A2 = [i for i in A1 if i in A0]

A3 = [A0[s] for s in A0]

A4 = [i for i in A1 if i in A3]

A5 = {i:i*i for i in A1}

A6 = [[i,i*i] for i in A1]

答案在这里:

A0 = {'a': 1, 'c': 3, 'b': 2, 'e': 5, 'd': 4}

A1 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

A2 = []

A3 = [1, 3, 2, 5, 4]

A4 = [1, 2, 3, 4, 5]

A5 = {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}

A6 = [[0, 0], [1, 1], [2, 4], [3, 9], [4, 16], [5, 25], [6, 36], [7, 49], [8, 64], [9, 81]]

请给出为什么A3= [1, 3, 2, 5, 4] 的理由,即A0初始化为什么为固定值

HTLiu     1502017-05-19 00:02:13

这个是根据Python2.X的dict的源码来实现的, 主要是 PyDict_SetItem()这个函数, 在字典里面添加一个项的步骤是,先对key求hash值,之后hash值与掩码mask做&操作,得到哈希表中空位置(slot),如果该位置未被占用,那key的槽就是它了,否则根据 开放定址 继续寻找。 因此输出的key的顺序就是在哈希表中的顺序,为什么是13254的原因如下:ln [16]: hash('a') & 7

Out[16]: 0

In [18]: hash('b') & 7

Out[18]: 3

In [19]: hash('c') & 7

Out[19]: 2

In [20]: hash('d') & 7

Out[20]: 5

In [21]: hash('e') & 7

Out[21]: 4

按照在哈希表中的顺序就是: acbed, 对应到题目就是13254.

ps: 为什么&7 是因为初始默认大小是8:#define PyDict_MINSIZE 8 ,

掩码mask=size-1,即:8-1 = 7.

如果元素个数超过了当前size的 2/3了,就会重新扩展。

苏兆君     22017-05-19 15:35:26

python2的结果:{'a': 1, 'c': 3, 'b': 2, 'e': 5, 'd': 4}

python3的结果:{'a': 1, 'd': 4, 'e': 5, 'b': 2, 'c': 3}

我就很讷闷了,招这样的人是来写Python解释器的还是写Python项目的。出题的人不去考Python库的知识面,来考数据在Python在解释器中的生成规则,就像你做饭不去考虑怎样去做熟它,而是去考虑这些米施了多少肥才长这么饱满。

HTLiu     12017-05-19 17:21:55

哈哈 原来是钓鱼贴

Qing Meng     12017-05-19 15:27:02

我win10+Python 3.6.0以及ubuntu 1604+Python 3.5.2上都测试hash('a'),hash('b')的结果,每次都不一样,不知道为什么。

HTLiu     12017-05-19 14:41:13

就是对哈希表resize, 然后将旧表数据复制到新表, 再对元素进行hash。

Qing Meng     02017-05-21 14:55:46

这个不太理解。'a'这个字符字面量在python中的表示跟content为'a'的字符串对象不一样吗?

安澜     02017-05-21 13:39:52

要注意你是对"a"这个字符hash还是content为"a"的字符串对象hash

王浩淼     02017-05-19 20:08:47

牛逼,学习了,感谢

刘顺裕     02017-05-19 16:09:17

其实我有答案,您的答案是我期望得到的,我也是翻阅了文档查看了dict源码和默认设置

Qing Meng     02017-05-19 15:51:43

谢谢解答!

HTLiu     02017-05-19 15:47:01

哈哈,的确是。python对dict的优化每个版本都有不一样的,据说python3.6对dict又是一次大改动,性能提高了不少。 不过在python2.x dict已经固定了,只是小改小闹。 python3.x 变化较大。

HTLiu     02017-05-19 15:42:52

上述的所有均是基于 Python 2.X, 开头也声明了。 Python3.X的dict 机制有很大不一样。甚至python3.6和python3.5 都变化很大,具体python3.x 没有研究过。 因为python的很多对象均是靠字典来维护的,因此每一个大版本都会对dict 做优化。

HTLiu     02017-05-19 14:46:00

不会吧, 我在双系统(win 10, ubuntu 1604) 均测试了三种情况都是, acbed, 有截图复现吗

知乎用户     02017-05-19 14:40:06

感激,学习了!

王奕岚     02017-05-19 14:22:43

学习了!请问扩展机制是什么?

codog     02017-05-19 14:21:02

我在pycharm上执行结果完全随机的,在ipython下执行是12345,在cmd下执行才有13254的结果,都是一个python解释器(版本2.7.12),为何?

HTLiu     02017-05-19 08:08:02

应该是一样的。我记得python源码中采取的hash函数是一种比较常规的hash算法,是固定的。此外我也测试了同一系统下不同的python进程得到的hash值是一样的呀。如果32位/64位的机器或许会不一样。

知乎用户     02017-05-19 08:03:14

谢谢

Qing Meng     02017-05-19 01:03:14

谢谢,学习了

有个问题,每次启动python解释器,都能够保证一个字符串(例如'a')的hash值相同的吗?

不同python解释器进程,built-in的hash()函数似乎对同一个字符串的hash结果不一样。

python中ht表示什么_如何看待某国内大公司Python面试题,有关dict中初始化为固定值?...相关推荐

  1. python搜网课原理_如何看待风变编程的 Python 网课?

    先说下个人情况,大学生,有编程基础. 当时是因为有些来年的课程据说会用到Python,所以想要提前学下(目的是数据可视化分析和数据挖掘).因为当时校园bbs上面看到过"风变编程", ...

  2. python运用在哪些地方_必看 | 2020年,Python十大应用领域介绍!

    原标题:必看 | 2020年,Python十大应用领域介绍! python作为一门当下极其火爆的编程语言,得到世界范围内无数编程爱好者和开发者喜欢并不是偶然的,除了要比其他编程语言更容易入门,pyth ...

  3. python实现最大独立集算法_2018校招总结(外企,国内大公司,国内创业公司)...

    2018校招总结(外企,国内大公司,国内创业公司) 本篇是我参加2018实习和校招的求职经历,实习和校招面了不少公司,就总结了笔试面试中遇到的一些问题和思考. 实习offer有网易互娱,今日头条,Hu ...

  4. python支持函数式编程吗_利用Fn.py库在Python中进行函数式编程

    尽管Python事实上并不是一门纯函数式编程语言,但它本身是一门多范型语言,并给了你足够的自由利用函数式编程的便利.函数式风格有着各种理论与实际上的好处(你可以在Python的文档中找到这个列表): ...

  5. set集合判断集合中是否有无元素_集合 (Set) | 一山不容二虎的 Python 数据类型

    点击上方"可乐python说"关注公众号,点击右上角 "..."选择"设为星标"第一时间获取最新分享! 前言 Hi,大家好,我是可乐, 今天 ...

  6. 风变编程python论文_如何看待风变编程的 Python 网课?

    作为风变推出的python课程的一名学员,很幸运能与风变相遇,更庆幸自己选择学习python,我学习的是python基础课程和爬虫精进课程,目前已经学完了python基础课程,不得不说对我的感触很深, ...

  7. python 去除panda安装包_沉淀,再出发:python中的pandas包

    沉淀,再出发:python中的pandas包 一.前言 python中有很多的包,正是因为这些包工具才使得python能够如此强大,无论是在数据处理还是在web开发,python都发挥着重要的作用,下 ...

  8. python中 和 的区别_举例子让你明白python中is和==的区别

    在说 is 和 == 的区别之前,我们先理解下python的变量.python的变量和java的变量有很大的区别,因为一个是动态语言,另一个是静态语言. java的变量就像是个盒子,是把对象的地址装进 ...

  9. 少儿学python真的有用吗_如何看待海淀妈妈们认为Python是儿童才学的低端编程?...

    海淀妈妈没说错啊~ 对于她们,python确实是儿童才学的低端编程. 儿童学编程,最重要的是易上手,当然要用代码看起来更简单的动态语言. 主流的动态语言里,ruby太骚,js太贱,php太浪,只有py ...

最新文章

  1. 最先进的NAS算法不如随机搜索,瑞士学者研究结果让人吃惊,也令人怀疑
  2. 球球大作战为什么显示服务器神游,球球大作战不能玩怎么解决_球球大作战不能玩解决方案详细分析_好特教程...
  3. 教你增加网站反向链接的7大法门和12奇招
  4. P2498 [SDOI2012]拯救小云公主
  5. 黑五已火 电商跨境成燎原之势
  6. SQL Server索引总结二
  7. jsp给前端注入值失败_基于 qiankun 的微前端最佳实践(图文并茂) 应用间通信篇...
  8. hadoop和spark的区别
  9. java命令执行的三种方式
  10. 工控--常用编程软件
  11. Java -- JSP面试题及答案
  12. 数论系列 求证:设自然数a,b互质,则不能表示成ax+by(x,y为非负整数)的最大整数是ab-a-b
  13. ORA-20011KUP-11024ORA-29913
  14. java室内导航_室内地图Android SDK定位导航 - 蜂鸟云
  15. jpg转换成pdf转换器免费版哪个好
  16. 错误Illegal invocation;使用jquery的ajax上传文件报错Illegal invocation
  17. JAVA基础---集合(一)--集合框架概述
  18. nginx详细配置负载均衡全过程以及宕机情况处理
  19. n3150 linux 4k,暴风影音N3150小主机硬件介绍和黑群晖体验
  20. 快速有效率的批量查询快递物流并分析

热门文章

  1. 19-A Walk-based Model on Entity Graphs for Relation Extraction(句内多对,多关系,多元,2018ACL
  2. linux提权辅助工具(二):linux-exploit-suggester-2.pl
  3. 个人项目:wc程序(java)
  4. C Builder中如何利用消息
  5. [PA 2014]Kuglarz
  6. 获取项目根路径,并在其下创建一个名称为userData 的目录。
  7. [转帖]FPGA--Vivado
  8. OD使用教程3(下) - 调试篇03|解密系列
  9. python-函数定义
  10. jsp出现The import Xxx type is not resolved...