6 组合数据类型

6.1 集合类型及操作

  • 集合是多个元素的无序组合:
    • 几何元素之间无序,每个元素唯一,不存在相同元素
    • 集合元素不可更改,不能是可变数据类型
  • 建立集合用 { } 或 set(), 空集合必须 set()
1
2
A = {"Python",123,("Py",123)}
B = set('pypy123') #{'1','2','3','p','y'}
  • 集合操作符:

0FgSHK.png
S ≤ T 或 S < T,返回 True/False 关系操作符
0FczB6.png

  • 集合处理方法:

0Fcxnx.png

0Fcjj1.png

  • 集合类型应用场景:
    • 数据去重:set( ) 和 list( )

6.2 序列类型及操作

  • 序列类型的定义:序列是具有先后关系的一族元素
    • 序列是一维元素向量,元素类型可以不同
    • 元素间由序号引导
  • 序列类型:字符串类型、元组类型、列表类型
  • 序列类型及操作:正向递增序号、反向递减序号
  • 序列类型通用操作符:

0FcXcR.png

0Fg9AO.png

  • 元组类型及操作:
    • 元组一旦被创建,不能更改
    • 元组用()或tuple()创建,元素间用逗号分隔
  • 列表类型及操作:
    • 列表是一种序列类型,创建后可以随意修改
    • 使用[]或list()创建,元素间用逗号,分隔
    • 列表中各元素类型可以不同,无长度限制
    • 列表直接赋值时,只是将新的指针指向原有列表
  • 列表类型操作方法:

0FgCND.png

0FgP4e.png

  • 序列类型应用场景:
    • 元素遍历
    • 通过元组类型进行数据保护

6.3 实例9:基本统计值计算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#CalStatisticsV1.py
def getNum(): #获取用户不定长度的输入
nums = []
iNumStr = input("请输入数字(回车退出): ")
while iNumStr != "":
nums.append(eval(iNumStr))
iNumStr = input("请输入数字(回车退出): ")
return nums

def mean(numbers): #计算平均值
s = 0.0
for num in numbers:
s = s + num
return s / len(numbers)

def dev(numbers, mean): #计算方差
sdev = 0.0
for num in numbers:
sdev = sdev + (num - mean)**2
return pow(sdev / (len(numbers)-1), 0.5)

def median(numbers): #计算中位数
sorted(numbers)
size = len(numbers)
if size % 2 == 0:
med = (numbers[size//2-1] + numbers[size//2])/2
else:
med = numbers[size//2]
return med

n = getNum() #主体函数
m = mean(n)
print("平均值:{},方差:{:.2},中位数:{}.".format(m, dev(n,m),median(n)))

6.4 字典类型及操作

  • 字典类型的定义:
    • 映射:映射是一种键(索引)和值(数据)的对应
    • 字典类型通过键值对建立索引
    • 采用 { } 或 dict()创建,键值对用: 来表示
    • 字典索引 [ ]
  • 字典类型操作函数:

0FgF9H.png
0Fgk3d.png

  • 字典类型应用场景
    • 映射的表达:统计数据出现次数

6.5 模块5:jieba库

  • jieba是优秀的中文分词第三方库
  • 精确模式:把文本精确分开,不存在冗余单词
  • 全模式:把文本中所有可能的词语都扫描出来,有冗余
  • jieba库常用函数:

0FgAgA.png
0FgEjI.png

6.6 实例10:文本词频统计

  • 《哈姆雷特》词频统计:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#CalHamletV1.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))
  • 三国演义出场人物统计:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#CalThreeKingdomsV2.py
import jieba
excludes = {"将军","却说","荆州","二人","不可","不能","如此"}
txt = open("threekingdoms.txt", "r", encoding='utf-8').read()
words = jieba.lcut(txt)
counts = {}
for word in words:
if len(word) == 1:
continue
elif word == "诸葛亮" or word == "孔明曰":
rword = "孔明"
elif word == "关公" or word == "云长":
rword = "关羽"
elif word == "玄德" or word == "玄德曰":
rword = "刘备"
elif word == "孟德" or word == "丞相":
rword = "曹操"
else:
rword = word
counts[rword] = counts.get(rword,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(10):
word, count = items[i]
print ("{0:<10}{1:>5}".format(word, count))

6.Practice

  • 人名独特性统计:统计字符串中共有多少个独特的人名
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
s = '''双儿 洪七公 赵敏 赵敏 逍遥子 鳌拜 殷天正 金轮法王 乔峰 杨过 洪七公 郭靖 
杨逍 鳌拜 殷天正 段誉 杨逍 慕容复 阿紫 慕容复 郭芙 乔峰 令狐冲 郭芙
金轮法王 小龙女 杨过 慕容复 梅超风 李莫愁 洪七公 张无忌 梅超风 杨逍
鳌拜 岳不群 黄药师 黄蓉 段誉 金轮法王 忽必烈 忽必烈 张三丰 乔峰 乔峰
阿紫 乔峰 金轮法王 袁冠南 张无忌 郭襄 黄蓉 李莫愁 赵敏 赵敏 郭芙 张三丰
乔峰 赵敏 梅超风 双儿 鳌拜 陈家洛 袁冠南 郭芙 郭芙 杨逍 赵敏 金轮法王
忽必烈 慕容复 张三丰 杨逍 令狐冲 黄药师 袁冠南 杨逍 完颜洪烈 殷天正
李莫愁 阿紫 逍遥子 乔峰 逍遥子 完颜洪烈 郭芙 杨逍 张无忌 杨过 慕容复
逍遥子 虚竹 双儿 乔峰 郭芙 黄蓉 李莫愁 陈家洛 杨过 忽必烈 鳌拜 王语嫣
洪七公 韦小宝 阿朱 梅超风 段誉 岳灵珊 完颜洪烈 乔峰 段誉 杨过 杨过 慕容复
黄蓉 杨过 阿紫 杨逍 张三丰 张三丰 赵敏 张三丰 杨逍 黄蓉 金轮法王 郭襄
张三丰 令狐冲 郭芙 韦小宝 黄药师 阿紫 韦小宝 金轮法王 杨逍 令狐冲 阿紫
洪七公 袁冠南 双儿 郭靖 鳌拜 谢逊 阿紫 郭襄 梅超风 张无忌 段誉 忽必烈
完颜洪烈 双儿 逍遥子 谢逊 完颜洪烈 殷天正 金轮法王 张三丰 双儿 郭襄 阿朱
郭襄 双儿 李莫愁 郭襄 忽必烈 金轮法王 张无忌 鳌拜 忽必烈 郭襄 令狐冲
谢逊 梅超风 殷天正 段誉 袁冠南 张三丰 王语嫣 阿紫 谢逊 杨过 郭靖 黄蓉
双儿 灭绝师太 段誉 张无忌 陈家洛 黄蓉 鳌拜 黄药师 逍遥子 忽必烈 赵敏
逍遥子 完颜洪烈 金轮法王 双儿 鳌拜 洪七公 郭芙 郭襄'''
ls = set(s.split(sep=" "))
ls.discard('')
ls.discard('\n')
print(len(ls))
  • 字典翻转输出:读入一个字典类型的字符串,反转其中的键值对输出
1
2
3
4
5
6
7
8
9
s = input()
try:
d = eval(s)
e = {}
for k in d:
e[d[k]] = k
print(e)
except:
print("输入错误")
  • 《沉默的羔羊》之最多单词
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import jieba
f = open("沉默的羔羊.txt")
ls = jieba.lcut(f.read())
d = {}
for w in ls:
d[w] = d.get(w,0)+1
maxc = 0
maxw = ""
for k in d:
if d[k] > maxc and len(k) > 2:
maxc = d[k]
maxw = k
if d[k] == maxc and len(k) > 2 and k > maxw:
maxw = k
print(maxw)
f.close()
  • 数字不同数之和:获得用户输入的一个整数N,输出N中出现不同数字的和

    输入:1231233213

    输出:6

1
2
3
4
5
6
s = input()
ls = []
for num in s:
ls.append(eval(num))
arr = set(ls)
print(sum(arr))
  • 人名最多数统计:输出字符串中出现次数最多的人名
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
s = '''双儿 洪七公 赵敏 赵敏 逍遥子 鳌拜 殷天正 金轮法王 乔峰 杨过 洪七公 郭靖 
杨逍 鳌拜 殷天正 段誉 杨逍 慕容复 阿紫 慕容复 郭芙 乔峰 令狐冲 郭芙
金轮法王 小龙女 杨过 慕容复 梅超风 李莫愁 洪七公 张无忌 梅超风 杨逍
鳌拜 岳不群 黄药师 黄蓉 段誉 金轮法王 忽必烈 忽必烈 张三丰 乔峰 乔峰
阿紫 乔峰 金轮法王 袁冠南 张无忌 郭襄 黄蓉 李莫愁 赵敏 赵敏 郭芙 张三丰
乔峰 赵敏 梅超风 双儿 鳌拜 陈家洛 袁冠南 郭芙 郭芙 杨逍 赵敏 金轮法王
忽必烈 慕容复 张三丰 赵敏 杨逍 令狐冲 黄药师 袁冠南 杨逍 完颜洪烈 殷天正
李莫愁 阿紫 逍遥子 乔峰 逍遥子 完颜洪烈 郭芙 杨逍 张无忌 杨过 慕容复
逍遥子 虚竹 双儿 乔峰 郭芙 黄蓉 李莫愁 陈家洛 杨过 忽必烈 鳌拜 王语嫣
洪七公 韦小宝 阿朱 梅超风 段誉 岳灵珊 完颜洪烈 乔峰 段誉 杨过 杨过 慕容复
黄蓉 杨过 阿紫 杨逍 张三丰 张三丰 赵敏 张三丰 杨逍 黄蓉 金轮法王 郭襄
张三丰 令狐冲 赵敏 郭芙 韦小宝 黄药师 阿紫 韦小宝 金轮法王 杨逍 令狐冲 阿紫
洪七公 袁冠南 双儿 郭靖 鳌拜 谢逊 阿紫 郭襄 梅超风 张无忌 段誉 忽必烈
完颜洪烈 双儿 逍遥子 谢逊 完颜洪烈 殷天正 金轮法王 张三丰 双儿 郭襄 阿朱
郭襄 双儿 李莫愁 郭襄 忽必烈 金轮法王 张无忌 鳌拜 忽必烈 郭襄 令狐冲
谢逊 梅超风 殷天正 段誉 袁冠南 张三丰 王语嫣 阿紫 谢逊 杨过 郭靖 黄蓉
双儿 灭绝师太 段誉 张无忌 陈家洛 黄蓉 鳌拜 黄药师 逍遥子 忽必烈 赵敏
逍遥子 完颜洪烈 金轮法王 双儿 鳌拜 洪七公 郭芙 郭襄 赵敏'''
ls = s.split(sep=" ")
d = {}
for name in ls:
d[name] = d.get(name,0)+1
maxvalue = 0
maxname = ''
for key in d:
if key == '\n' or key == '':
continue
elif d[key] > maxvalue:
maxvalue = d[key]
maxname = key
print(maxname)