第6章 组合数据类型

来自CloudWiki
跳转至: 导航搜索

第6章 组合数据类型

  • Python6-1.png

集合的基本概念

集合类型概述

Python语言中的集合类型与数学中的集合概念一致,即包含0个或多个数据项的无序组合。

Python10-24.png

集合的创建

  • 直接将集合赋值给变量即可创建一个集合对象。
>>> a = {3, 5}                         #创建集合对象
>>> type(a)                            #查看对象类型
<class 'set'>
  • 也可以使用函数set()函数将列表、元组、字符串、range对象等其他可迭代对象转换为集合,如果原来的数据中存在重复元素,则在转换为集合的时候只保留一个;如果原序列或迭代对象中有不可哈希的值,无法转换成为集合,抛出异常。
>>> a_set = set(range(8, 14))                     #把range对象转换为集合
>>> a_set
{8, 9, 10, 11, 12, 13}
>>> b_set = set([0, 1, 2, 3, 0, 1, 2, 3, 7, 8])   #转换时自动去掉重复元素
>>> b_set
{0, 1, 2, 3, 7, 8}
>>> x = set()                                     #空集合

集合运算

  • 集合运算:
>>> a_set = set([8, 9, 10, 11, 12, 13])
>>> b_set = {0, 1, 2, 3, 7, 8}
>>> a_set | b_set                     #并集
{0, 1, 2, 3, 7, 8, 9, 10, 11, 12, 13}
>>> a_set.union(b_set)                #并集
{0, 1, 2, 3, 7, 8, 9, 10, 11, 12, 13}
>>> a_set & b_set                     #交集
{8}
>>> a_set.intersection(b_set)         #交集
{8}
>>> a_set.difference(b_set)           #差集
{9, 10, 11, 12, 13}
>>> a_set - b_set
{9, 10, 11, 12, 13}
>>> a_set.symmetric_difference(b_set) #对称差集
{0, 1, 2, 3, 7, 9, 10, 11, 12, 13}
>>> a_set ^ b_set
{0, 1, 2, 3, 7, 9, 10, 11, 12, 13}

元组的基本概念

>>> t= (1,2,3)


>>> type(t)
<class 'tuple'>


>>> t=(1,2,3)


>>> 1 in t
True
>>> "1" in t
False


>>> s=(4,5,6)


>>> t+s
(1, 2, 3, 4, 5, 6)


>>> t*2
(1, 2, 3, 1, 2, 3)


>>> 2*t
(1, 2, 3, 1, 2, 3)


>>> t[1]
2
>>> t[:2]
(1, 2)


>>> t[::2]
(1, 3)


>>> len(t)
3


>>> min(t)
1


>>> max(t)
3
>>> t.index(2)
1


>>> t.count(1)
1

元组类型主要在Python语法相关的场景使用,例如,当函数返回多个值时,多个返回值以元组类型返回,实际返回的一个数据类型

>>> def f(x):
	return x,x+1,x+2

>>> f(1)
(1, 2, 3)

>>> type(f(1))
<class 'tuple'>


列表类型概述

  • 使用“=”直接将一个列表赋值给变量即可创建列表对象。
>>> a_list = ['a', 'b', 'mpilgrim', 'z', 'example']
>>> a_list = []                       #创建空列表
  • 也可以使用list()函数把元组、range对象、字符串、字典、集合或其他可迭代对象转换为列表。
>>> list((3,5,7,9,11))                #将元组转换为列表
[3, 5, 7, 9, 11]
>>> list(range(1, 10, 2))             #将range对象转换为列表
[1, 3, 5, 7, 9]
>>> list('hello world')               #将字符串转换为列表
['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']
>>> list({3,7,5})                     #将集合转换为列表
[3, 5, 7]</nowiki>

列表的索引

  • 创建列表之后,可以使用整数作为下标来访问其中的元素,其中0表示第1个元素,1表示第2个元素,2表示第3个元素,以此类推;列表还支持使用负整数作为下标,其中-1表示最后1个元素,-2表示倒数第2个元素,-3表示倒数第3个元素,以此类推。
>>> x = list('Python')             #创建类别对象
>>> x
['P', 'y', 't', 'h', 'o', 'n']
>>> x[0]                           #下标为0的元素,第一个元素
'P'
>>> x[-1]                          #下标为-1的元素,最后一个元素
'n'
  • Python6-2.png
  • 可以使用遍历循环对列表类型进行遍历操作
>>> x = list('Python')
       
>>> for i in x:
       print(i)

       
P
y
t
h
o
n

列表类型的操作

列表的操作函数

  • max()、min()函数用于返回列表中所有元素的最大值和最小值,
  • sum()函数用于返回列表中所有元素之和;
  • len()函数用于返回列表中元素个数,zip()函数用于将多个列表中元素重新组合为元组并返回包含这些元组的zip对象;
  • enumerate()函数返回包含若干下标和值的迭代对象;
  • map()函数把函数映射到列表上的每个元素,filter()函数根据指定函数的返回值对列表元素进行过滤;
  • all()函数用来测试列表中是否所有元素都等价于True,any()用来测试列表中是否有等价于True的元素。
  • 标准库functools中的reduce()函数以及标准库itertools中的compress()、groupby()、dropwhile()等大量函数也可以对列表进行操作。
>>> x = list(range(11))              #生成列表
>>> import random
>>> random.shuffle(x)                #打乱列表中元素顺序
>>> x
[0, 6, 10, 9, 8, 7, 4, 5, 2, 1, 3]
>>> all(x)                           #测试是否所有元素都等价于True
False
>>> any(x)                           #测试是否存在等价于True的元素
True
>>> max(x)                           #返回最大值
10
>>> max(x, key=str)                  #按指定规则返回最大值
9
>>> min(x)
0
>>> sum(x)                    #所有元素之和
55
>>> len(x)                    #列表元素个数
11

列表的操作方法

添加元素

  • append()用于向列表尾部追加一个元素,insert()用于向列表任意指定位置插入一个元素
>>> x = [1, 2, 3]
>>> x.append(4)                     #在尾部追加元素

append仅用于增加一个元素,如果希望增加多个元素,可以使用加号,将两个列表合并:

>>> ls =[1,2,3]

>>> lt =[4,5,6]

>>> ls = ls + lt
>>> print(ls)
[1, 2, 3, 4, 5, 6]

insert(i,x)在列表ls中序号i位置上增加元素x,序号i之后的元素序号依次增加。

>> print(ls)
[1, 2, 3, 4, 5, 6]
>>> ls.insert(1,1.5)
>>> print(ls)
[1, 1.5, 2, 3, 4, 5, 6]

删除元素

  • pop()用于删除并返回指定位置(默认是最后一个)上的元素;
  • remove()用于删除列表中第一个值与指定值相等的元素;
  • clear()用于清空列表中的所有元素。这3个方法也属于原地操作
>>> x = [1, 2, 3, 4, 5, 6, 7]
>>> x.pop()                        #弹出并返回尾部元素
7
>>> x.pop(0)                       #弹出并返回指定位置的元素
1
>>> x.clear()                      #删除所有元素
>>> x
[]
>>> x = [1, 2, 1, 1, 2]
>>> x.remove(2)                    #删除首个值为2的元素
>>> del x[3]                       #删除指定位置上的元素
>>> x
[1, 1, 1]
  • 列表对象的sort()方法用于按照指定的规则对所有元素进行排序;reverse()方法用于将列表所有元素逆序或翻转。
>>> x = list(range(11))                       #包含11个整数的列表
>>> import random
>>> random.shuffle(x)                         #把列表x中的元素随机乱序
>>> x
[6, 0, 1, 7, 4, 3, 2, 8, 5, 10, 9]
>>> x.sort()                                  #按默认规则排序
>>> x
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> x.reverse()  

复制列表

  • copy复制列表,而直接赋值的方法不产生新列表
>>> x = list(range(11))
       
>>> y = x.copy()
       
>>> x.clear()
       
>>> print(y)
       
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> x = list(range(11))
       
>>> y = x
       
>>> x.clear()
       
>>> print(y)
       
[]

列表是一个十分灵活的数据结构,当程序需要使用组合数据类型管理批量数据时,请尽量使用列表类型。

字典类型

字典的定义

"键值对"是组织数据的一种重要方式,广泛应用在当代大型信息系统中。键值对的基本思想是将“值”信息关联一个“键”信息,进而通过键信息查找对应的值信息,这个过程叫做映射,Python通过字典类型实现映射。

>>> d= {"201801":"小明","201802":"小红","201803":"小白"}
>>> print(d)
{'201801': '小明', '201802': '小红', '201803': '小白'}

字典的索引

  • 字典中的每个元素表示一种映射关系或对应关系,根据提供的“键”作为下标就可以访问对应的“值”,如果字典中不存在这个“键”会抛出异常。
>>> print(d['201802'])
小红

>>> d['201802']='新小红'
>>> print(d)
{'201801': '小明', '201802': '新小红', '201803': '小白'}

利用大括号可以创建一个新字典:

>>> t={}
>>> t["201804"]="小新"

>>> print(d)
{'201801': '小明', '201802': '新小红', '201803': '小白'}

字典类型的操作

字典的操作函数

  • len()给出字典元素的个数
  • max()、min() 返回字典d中最小或最大索引值。
>>> d={"01":"小明","02":"小红","03":"小白"}
       
>>> len(d)
       
3
>>> min(d)
       
'01'
>>> max(d)
       
'03'
>>> d = dict()
       
>>> print(d)
       
{}

字典的操作方法

  • d.keys()返回字典中的所有键信息。
>>> d={"01":"小明","02":"小红","03":"小白"}
       
>>> d.keys()
       
dict_keys(['01', '02', '03'])
>>> list(d.keys())
       
['01', '02', '03']
  • d.values()返回字典中的所有值信息,用dict_values表示,可以将其转换为列表类型
>>> d.values()
       
dict_values(['小明', '小红', '小白'])
>>> list(d.values())
       
['小明', '小红', '小白']
  • d.items()返回字典中的所有键值对信息,用dict_items表示,可以将其转换为列表类型
>>> d.items()
       
dict_items([('01', '小明'), ('02', '小红'), ('03', '小白')])
>>> list(d.items())
       
[('01', '小明'), ('02', '小红'), ('03', '小白')]
  • 字典对象提供了一个get()方法用来返回指定“键”对应的“值”,并且允许指定该键不存在时返回特定的“值”
  • d.pop(key,defaults)根据键信息查找并取出值信息,如果key存在则返回相应值,否则返回默认值
  • 相比于get(),pop()在取出相应值之后,从字典中删除对应的键值对。
>>> d.get('01')
       
'小明'
>>> d.get('04','不存在')
       
'不存在'
>>> d.pop('01')
       
'小明'
>>> d.items()
 
dict_items([('02', '小红'), ('03', '小白')])

  • d.popitem()随机从字典中取出一个键值对。
>>> print(d.popitem())
       
('03', '小白')
>>> d
  • d.clear()来删除字典中所有键值对。
  • 可以用del来删除
> >> d       
{ '01': '小明', '02': '小红'}
>>> del d['01']
       
>>> d
  • 用in来判断是否存在:
{'02': '小红'}
>>> '02' in d
       
True
>>> '01' in d
       
False
  • 用for来进行遍历:
>>> d={"01":"小明","02":"小红","03":"小白"}
       
>>> for k in d:
       print(k,d.get(k))

       
01 小明
02 小红
03 小白
>>> 

实例解析:文本词频统计

我们可以采用字典来解决词频统计问题。

  • 输入:从文件中读取一篇文章。
  • 处理:采用字典数据结构,统计词语出现频率。
  • 输出:文章中最常出现的十个单词及出现次数。

英文词频统计

英文文本以空格或标点符号来分隔词语获得单词并统计数量相对容易。

代码:

#e10.1CalHamlet.py
def getText():
    txt = open("hamlet.txt", "r").read()
    txt = txt.lower()
    for ch in '!"#$%&()*+,-./:;<=>?@[\\]^_‘{|}~':
        txt = txt.replace(ch, " ")   #将文本中特殊字符替换为空格
    return txt
hamletTxt = getText()
words  = hamletTxt.split()
counts = {}
for word in words:			
    counts[word] = counts.get(word,0) + 1
items = list(counts.items())#将字典转换为列表
items.sort(key=lambda x:x[1], reverse=True) #按照第二列排序
for i in range(10):
    word, count = items[i]
    print ("{0:<10}{1:>5}".format(word, count))

中文词频分析

jieba库的使用

中文词频分析

#e10.3CalThreeKingdoms.py
import jieba
excludes = {}#{"将军","却说","丞相"}
txt = open("三国演义.txt", "r", encoding='utf-8').read()
words  = jieba.lcut(txt)
counts = {}
for word in words:
    if len(word) == 1:  #排除单个字符的分词结果
        continue
    else:
        counts[word] = counts.get(word,0) + 1
for word in excludes:
    del(counts[word])
items = list(counts.items())
items.sort(key=lambda x:x[1], reverse=True) 
for i in range(15):
    word, count = items[i]
    print ("{0:<10}{1:>5}".format(word, count))