gxyzwangyi 发表于 2014-05-12 23:19

关于字典的一个神奇问题

x1=
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}这样奇怪的顺序排布。请问各位这是为什么?

pastebt 发表于 2014-05-13 07:11

回复 1# gxyzwangyi


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

reyleon 发表于 2014-05-13 12:01

字典是无序的 :mrgreen:

gxyzwangyi 发表于 2014-05-13 21:50

可是为什么这个排列有明显的规律啊。1 3 2 5 4 7 6 9 8......从3开始就是减一再加三的排列啊,请问这是什么原因导致的。


回复 2# pastebt


   

timespace 发表于 2014-05-13 21:53

回复 4# gxyzwangyi
从这么一个微小的例子就能看出dict实现规律,实在不容易,能否详细说明?


   

gxyzwangyi 发表于 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,其规律就是除了第一项之后每两项交换了一下位置,不知道这是如何形成的。
   

elu_ligao 发表于 2014-05-13 22:51

试了下, 确实有点奇怪, 求指教
>>> x1=
>>> 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']
>>> d = dict(zip(x2, x1))      
>>> for i in d:         
...   print i, d.get(i)
...
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
>>> d2 = dict(zip(x1, x2))
>>> for i in d2:         
...   print i, d2.get(i)
...
1 A
2 B
3 C
4 D
5 E
6 F
7 G
8 H
9 I
10 J
11 K
12 L
13 M
14 N
15 O
16 P
17 Q
18 R
19 S
20 T
21 U
22 V
23 W
24 X
25 Y
26 Z

r2007 发表于 2014-05-14 15:06

键值哈稀函数的问题吧,可以搞一个dict子类,重构一个哈稀函数。

timespace 发表于 2014-05-14 18:48

本帖最后由 timespace 于 2014-05-14 18:50 编辑

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

可能你仅仅是需要保证输入顺序吧:Python 2.7.5 (default, Sep 12 2013, 21:33:34)
on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from string import ascii_uppercase
>>> from collections import OrderedDict
>>> alphanum = [(b, a+1) for a,b in enumerate(ascii_uppercase)]
>>> dict(alphanum)
{'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}
>>> OrderedDict(alphanum)
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)])
>>>
页: [1]
查看完整版本: 关于字典的一个神奇问题