提醒:本页面将不再更新、维护或者支持,文章、评论所叙述内容存在时效性,涉及技术细节或者软件使用方面不保证能够完全有效可操作,请谨慎参考!

最近尝试着改用Python取代VBScript来实现一些功能,当然也遇到了一些麻烦,这里我要说明的是Python的字典和VBScript所调用的字典对象是有些区别的。

字典可以叫做哈希(Hash)表或者K-V存储表(Key-Value),也就是说一个独立的键值对应一条数据,Key是不能重复的,因为需要快速索引数据,字典进行数据查找,效率是很高的,当然其效率是靠空间换来的。

好了,说了这么多,下面介绍下,我遇到的一点区别,在VBScript中不原生支持字典特性,不过我们可以通过CreateObject("Scripting.Dictionary")来创建一个字典对象,然后通过Add方法添加Key Value,也可以说我比较的是Python和Scripting.Dictionary组件对象的区别,我在 前面的文章 中简单的介绍过这个对象相关的使用方法,这里再给出相应的脚本:

Dim objDict
Set objDict = CreateObject("Scripting.Dictionary")

  objDict.Add "b", "2"
  objDict.Add "a", "1"
  objDict.Add "c", "3"
  objDict.Add "e", "5"
  objDict.Add "d", "4"

  ' 以下是遍历字典
  Dim objKeys, objItems, i
  objKeys = objDict.Keys
  objItems = objDict.Items
  For i = 0 To objDict.Count -1
    WSH.Echo objKeys(i) &_
             " " & objItems(i)
  Next

  objDict.RemoveAll
Set objDict = Nothing

' -- OUTPUT --
' b 2
' a 1
' c 3
' e 5
' d 4

通过上面的代码可以看出Scripting.Dictionary遍历字典的输出顺序是按照我们调用add添加字典元素的顺序,由于Python语言原生支持字典属性,因此调用上面会方便很多:

dict = {"b":"2", "a":"1",
        "c":"3", "e":"5", "d":"4"}

for key,value in dict.items():
    print(key,value)

# -- OUTPUT --
# a 1
# c 3
# b 2
# e 5
# d 4

但是输出的顺序却不是我们预想的那样初始化的顺序,查询相关文献得知,Python保证遍历字典所有元素,但不保证遍历的顺序,假如我们期望按预先的顺序进行遍历的话,我目前找到一个办法,就是通过两个List分别存储Key和Value,然后通过zip合并为Dictionary,再遍历:

# 通过zip方法合并两个List为Dictionary
# 遍历会按原先的顺序
keys = ["b", "a", "c", "e", "d"]
values = ["2", "1", "3", "5", "4"]

for key,value in zip(keys, values):
    print(key,value)

# -- OUTPUT --
# b 2
# a 1
# c 3
# e 5
# d 4

然后我突发奇想,将Dictionary的keys()和values()集合调用zip,然后遍历会不会是按顺序的呢?很遗憾,答案是否定的,最后Python遍历字典的测试代码如下:

# -*- coding:UTF-8 -*-

import os

def main():
    dict = {"b":"2", "a":"1",
            "c":"3", "e":"5", "d":"4"}

    for key,value in dict.items():
        print(key,value)

    print("-------------------")

    for i,value in enumerate(dict):
        print(i,value)    

    print("-------------------")

    # 通过zip方法合并两个List为Dictionary
    # 遍历会按原先的顺序
    keys = ["b", "a", "c", "e", "d"]
    values = ["2", "1", "3", "5", "4"]

    for key,value in zip(keys, values):
        print(key,value)

    print("-------------------")

    # 直接通过zip,字典keys和values集合
    # 遍历依旧不会按照初始顺序
    for key,value in zip(dict.keys(), dict.values()):
        print(key,value)

    pause()

def pause():
    os.system("PAUSE")

if __name__ == '__main__':
    main()

# -- OUTPUT --
# a 1
# c 3
# b 2
# e 5
# d 4
# -------------------
# 0 a
# 1 c
# 2 b
# 3 e
# 4 d
# -------------------
# b 2
# a 1
# c 3
# e 5
# d 4
# -------------------
# a 1
# c 3
# b 2
# e 5
# d 4

如果找到什么好的办法我再更新吧:-)

2013年8月27日更新

Python的collections包中有个非常有用的类型 OrderedDict 可以实现顺序字典功能。