且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

《Python数据科学指南》——1.2 使用字典对象

更新时间:2022-10-12 23:34:44

本节书摘来自异步社区《Python数据科学指南》一书中的第1章,第1.2节,作者[印度] Gopi Subramanian ,方延风 刘丹 译,更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.2 使用字典对象

在Python语言中,容器是一种对象,它能够容纳任意数量、任意类型的对象。它可以对子对象进行操作,还可以迭代操作。字典、元组、列表还有集合都是容器对象。在collections模块中,Python提供了更多的容器类型。在这一节中,我们先来仔细了解字典。

1.2.1 准备工作

我们先通过一个Python的脚本示例来理解字典是如何操作的,这段脚本用来统计词频,也就是每个词在给定的文本中出现的次数。

1.2.2 操作方法

下面的示例演示了在Python中对字典对象如何操作。通过对一句简单的文本进行处理,我们仔细探究一下真正的字典创建过程。

# 1.  加载一个句子到变量中
sentence = "Peter Piper picked a peck of pickled peppers A peck of
pickled \
peppers Peter Piper picked If Peter Piper picked a peck of pickled \
peppers Wheres the peck of pickled peppers Peter Piper picked"

# 2.初始化一个字典对象
word_dict = {}
# 3. 执行对词频的统计
for word in sentence.split():
     if word not in word_dict:
          word_dict[word] =1
     else:
          word_dict[word]+=1
# 4. 打印输出词频结果
print word_dict

1.2.3 工作原理

前面的代码创建了一个词频表,记录了每个词及其出现的频率。

最终的打印输出结果如下。

{'a': 2, 'A': 1, 'Peter': 4, 'of': 4, 'Piper': 4, 'pickled': 4,
'picked': 4, 'peppers': 4, 'the': 1, 'peck': 4, 'Wheres': 1, 'If': 1}

上面的结果是一个键值对,对于每个词(键),相对应的是频率(值)。字典数据结构是一个哈希映射,值对应于键。在上例中,我们是把字符串当作键,当然,我们也可以把其他不可变的数据类型当作键。

要看更多关于Python中的可变和不可变对象的详细讨论,请访问如下链接。

https://docs.python.org/2/reference/datamodel.html

同样地,值可以是任意数据类型,包括自定的类。在第2步中,我们初始化了一个字典对象,此时,它还是空的。当一个新键被添加到字典的时候,如果对字典进行的操作涉及这个新键,将抛出一个KeyError错误。在上例中的第3步里,我们可以在for循环里添加一个if语句来控制这个情形,我们也可以使用以下语句。

word_dict.setdefault(word,0)

如果我们要在循环中给一个字典添加元素,需要对字典的所有键进行操作,这个语句会被重复调用,我们可能并没有清楚地意识到这一点。

for word in sentence.split():
     word_dict.setdefault(word,0)
     word_dict[word]+=1

1.2.4 更多内容

在Python 2.5及以上版本的collections模块中,有一个defaultdict类。它和setdefault方法有着对应关系,defaultdict类调用的实例如下所示。

from collections import defaultdict

sentence = "Peter Piper picked a peck of pickled peppers A peck of\
             pickled peppers Peter Piper picked If Peter Piper picked a peck of\
             pickled peppers Wheres the peck of pickled peppers Peter Piper picked"

word_dict = defaultdict(int)

for word in sentence.split():
     word_dict[word]+=1
print word_dict

你可能已经注意到了,我们在代码中包含了collections.defaultdict,初始化了字典。请注意defaultdict的参数int,采用了一个函数作为参数。在这个例子中,我们传递int()函数,当字典遇到一个之前没有遇到的键时,它将int()函数返回值用来初始化这个键,本例中这个值是0。在本书后续部分里,我们还会使用到defaultdict。


《Python数据科学指南》——1.2 使用字典对象

标准的字典不会记住键被添加进来的顺序,在collections模块中,Python提供了一个能记住键被添加的顺序的容器,叫作OrderedDict。请阅读如下的Python文档了解更多细节。

https://docs.python.org/2/library/collections.html# collections.OrderedDict。

遍历字典是很简单的,keys()函数可以遍历所有的键,values()函数可以遍历所有的值,items()函数则可以遍历所有的键值对,请看下面的例子。

For key, value in word_dict.items():
print key,value

在本例中,dict.items()函数迭代地遍历了字典中的所有键值对。

如下的Python文档非常详细地讲述了字典,是很方便的指南手册。详见:https://docs.python.org/2/tutorial/datastructures.html#dictionaries

字典是一种非常有用的媒介数据结构,如果你的程序使用JSON在模块间传送信息,字典就是最适合的数据类型。从JSON文件中装载数据到字典或者复制字典作为JSON字符串都很方便。

Python提供了高效的JSON操作库,详见:https://docs.python.org/2/library/json.html

Counter是一个字典子类,用来统计键值对类型的对象,我们的例子中的词频统计用Counter来完成是轻而易举的。

请看下面的示例。

from collections import Counter

sentence = "Peter Piper picked a peck of pickled peppers A peck of pickled \
             peppers Peter Piper picked If Peter Piper picked a peck of\
             pickled peppers Wheres the peck of pickled peppers Peter Piper \
             picked"

words = sentence.split()

word_count = Counter(words)

print word_count['Peter']
print word_dict

输出结果如下,你可以和前面的例子做一个比较。

Counter({'Peter': 4, 'of': 4, 'Piper': 4, 'pickled': 4, 'picked': 4,
'peppers': 4, 'peck': 4, 'a': 2, 'A': 1, 'the': 1, 'Wheres': 1, 'If':1})

访问以下链接,你能更好地理解Counter类。

https://docs.python.org/2/library/collections.html#collections.Counter

1.2.5 参考资料

第1章“Python在数据科学中的应用”中1.3节“使用字典的字典”的相关内容。