免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3398 | 回复: 8
打印 上一主题 下一主题

关于字典的一个神奇问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-05-12 23:19 |只看该作者 |倒序浏览
x1=[i for i in range(1,27)]
x2=['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
zipped=zip(x2,x1)
fdict = dict(zipped)
print fdict
这是创建一个关于将ABCD.……26字母键对应123456.....的值的字典
可是最后显示的是{'A': 1, 'C': 3, 'B': 2, 'E': 5, 'D': 4, 'G': 7, 'F': 6, 'I': 9, 'H': 8, 'K': 11, 'J': 10, 'M': 13, 'L': 12, 'O': 15, 'N': 14, 'Q': 17, 'P': 16, 'S': 19, 'R': 18, 'U': 21, 'T': 20, 'W': 23, 'V': 22, 'Y': 25, 'X': 24, 'Z': 26}这样奇怪的顺序排布。请问各位这是为什么?

论坛徽章:
0
2 [报告]
发表于 2014-05-13 07:11 |只看该作者
回复 1# gxyzwangyi


    dict 是没有顺序的,自然跟你输入的顺序没关系

论坛徽章:
60
20周年集字徽章-20	
日期:2020-10-28 14:04:3015-16赛季CBA联赛之北京
日期:2016-07-06 15:42:0715-16赛季CBA联赛之同曦
日期:2016-06-12 10:38:0915-16赛季CBA联赛之佛山
日期:2016-05-27 11:54:56黄金圣斗士
日期:2015-12-02 11:44:35白银圣斗士
日期:2015-11-25 14:32:43白银圣斗士
日期:2015-11-23 12:53:352015亚冠之布里斯班狮吼
日期:2015-10-21 16:55:482015亚冠之首尔
日期:2015-09-01 16:46:052015亚冠之德黑兰石油
日期:2015-08-31 11:39:192015亚冠之萨济拖拉机
日期:2015-08-28 21:06:5315-16赛季CBA联赛之广东
日期:2016-07-12 14:58:53
3 [报告]
发表于 2014-05-13 12:01 |只看该作者
字典是无序的

论坛徽章:
0
4 [报告]
发表于 2014-05-13 21:50 |只看该作者
可是为什么这个排列有明显的规律啊。1 3 2 5 4 7 6 9 8......  从3开始就是减一再加三的排列啊,请问这是什么原因导致的。


回复 2# pastebt


   

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
5 [报告]
发表于 2014-05-13 21:53 |只看该作者
回复 4# gxyzwangyi
从这么一个微小的例子就能看出dict实现规律,实在不容易,能否详细说明?


   

论坛徽章:
0
6 [报告]
发表于 2014-05-13 22:19 |只看该作者
回复 5# timespace

我刚学python不久,对其运行机制很少了解,超级新手了。。。不过这个dict实现的规律是有点奇怪,我的数字(1-26)和字符(A-Z)都是按顺序排列下去,可是通过zip功能将其合并为的字典排布却不是按顺序排布的。楼上有朋友说字典是无序的,可是fdict这个字典虽然不是按顺序排布的,但是还是有一定的规律的,值依次是1 3 2 5 4 7 6 ......键位是 A C B E D F G,其规律就是除了第一项之后每两项交换了一下位置,不知道这是如何形成的。
   

论坛徽章:
29
程序设计版块每日发帖之星
日期:2016-02-29 06:20:0015-16赛季CBA联赛之天津
日期:2016-08-10 10:33:1115-16赛季CBA联赛之深圳
日期:2016-08-17 15:07:2015-16赛季CBA联赛之佛山
日期:2016-11-07 11:33:5015-16赛季CBA联赛之广夏
日期:2016-11-15 09:13:31CU十四周年纪念徽章
日期:2016-11-24 14:12:25极客徽章
日期:2016-12-07 14:03:4015-16赛季CBA联赛之深圳
日期:2016-12-07 17:15:2715-16赛季CBA联赛之北京
日期:2016-12-22 09:30:0115-16赛季CBA联赛之深圳
日期:2016-12-22 10:49:2115-16赛季CBA联赛之山西
日期:2017-02-10 09:05:3215-16赛季CBA联赛之同曦
日期:2017-02-27 14:19:08
7 [报告]
发表于 2014-05-13 22:51 |只看该作者
  1. 试了下, 确实有点奇怪, 求指教
  2. >>> x1=[i for i in range(1,27)]
  3. >>> x2=['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
  4. >>> d = dict(zip(x2, x1))      
  5. >>> for i in d:           
  6. ...     print i, d.get(i)
  7. ...
  8. A 1
  9. C 3
  10. B 2
  11. E 5
  12. D 4
  13. G 7
  14. F 6
  15. I 9
  16. H 8
  17. K 11
  18. J 10
  19. M 13
  20. L 12
  21. O 15
  22. N 14
  23. Q 17
  24. P 16
  25. S 19
  26. R 18
  27. U 21
  28. T 20
  29. W 23
  30. V 22
  31. Y 25
  32. X 24
  33. Z 26
  34. >>> d2 = dict(zip(x1, x2))
  35. >>> for i in d2:         
  36. ...     print i, d2.get(i)
  37. ...
  38. 1 A
  39. 2 B
  40. 3 C
  41. 4 D
  42. 5 E
  43. 6 F
  44. 7 G
  45. 8 H
  46. 9 I
  47. 10 J
  48. 11 K
  49. 12 L
  50. 13 M
  51. 14 N
  52. 15 O
  53. 16 P
  54. 17 Q
  55. 18 R
  56. 19 S
  57. 20 T
  58. 21 U
  59. 22 V
  60. 23 W
  61. 24 X
  62. 25 Y
  63. 26 Z
复制代码

论坛徽章:
7
荣誉版主
日期:2011-11-23 16:44:17子鼠
日期:2014-07-24 15:38:07狮子座
日期:2014-07-24 11:00:54巨蟹座
日期:2014-07-21 19:03:10双子座
日期:2014-05-22 12:00:09卯兔
日期:2014-05-08 19:43:17卯兔
日期:2014-08-22 13:39:09
8 [报告]
发表于 2014-05-14 15:06 |只看该作者
键值哈稀函数的问题吧,可以搞一个dict子类,重构一个哈稀函数。

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
9 [报告]
发表于 2014-05-14 18:48 |只看该作者
本帖最后由 timespace 于 2014-05-14 18:50 编辑

回复 6# gxyzwangyi
其实这个规律没有实际意义,当看过dict源代码时自然不会留意这种表面现象,当不看dict源码时这规律也没有帮助,因为其随着输入/内部HASH函数/解决冲突方式/其他优化而改变,这是散列表(哈希表)构造算法决定的,其他语言也是如此(C++ unordered_map, Java HashMap ...)。

可能你仅仅是需要保证输入顺序吧:
  1. Python 2.7.5 (default, Sep 12 2013, 21:33:34)
  2. [GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] on darwin
  3. Type "help", "copyright", "credits" or "license" for more information.
  4. >>> from string import ascii_uppercase
  5. >>> from collections import OrderedDict
  6. >>> alphanum = [(b, a+1) for a,b in enumerate(ascii_uppercase)]
  7. >>> dict(alphanum)
  8. {'A': 1, 'C': 3, 'B': 2, 'E': 5, 'D': 4, 'G': 7, 'F': 6, 'I': 9, 'H': 8, 'K': 11, 'J': 10, 'M': 13, 'L': 12, 'O': 15, 'N': 14, 'Q': 17, 'P': 16, 'S': 19, 'R': 18, 'U': 21, 'T': 20, 'W': 23, 'V': 22, 'Y': 25, 'X': 24, 'Z': 26}
  9. >>> OrderedDict(alphanum)
  10. OrderedDict([('A', 1), ('B', 2), ('C', 3), ('D', 4), ('E', 5), ('F', 6), ('G', 7), ('H', 8), ('I', 9), ('J', 10), ('K', 11), ('L', 12), ('M', 13), ('N', 14), ('O', 15), ('P', 16), ('Q', 17), ('R', 18), ('S', 19), ('T', 20), ('U', 21), ('V', 22), ('W', 23), ('X', 24), ('Y', 25), ('Z', 26)])
  11. >>>
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP