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

    xiaoxiao2024-07-16  96

    本节书摘来自异步社区《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。

    标准的字典不会记住键被添加进来的顺序,在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节“使用字典的字典”的相关内容。

    相关资源:Python数据科学手册【最新高清完整版PDF】 【配套源代码】
    最新回复(0)