Python语言程序设计_6

学习过程主要依照中国MOOC课程,感谢MOOC,感谢北理授课大佬。

集合类型及操作

集合类型定义

-与数学中的集合概念一致,是多个元素的无序组合,每个元素唯一,不存在相同元素。
-集合用大括号{}表示,元素间用逗号分隔。

1
2
3
>>> A = {"python", 123, ("python", 123)}
>>> B = set("pypy123")
{'1', 'p', '2', '3', 'y'}

-建立集合类型用{}或set();建立空集合类型必须使用 set()。

集合操作符

S|T:包含集合S和T中的所有元素;
S-T:包含在集合S但不在T中的元素;
S&T:包含同时在集合S和T中的元素;
S^T:包含集合S和T中的非相同元素;
S <= T/S < T:返回True/False,判断S和T的子集关系;
S >= T/S > T:返回True/False,判断S和T的包含关系;

集合处理方法

S.add(x):如果x不在集合S中,将x增加到S
S.discard(x):移除S中元素x,如果x不在集合S中,不报错
S.remove(x):同上,如不在,产生keyerror异常
S.clear():移除S中所有元素
S.pop():随机返回S的一个元素,更新S
len(S):返回集合S的元素个数

集合类型应用场景

数据去重

1
2
3
4
5
>>>ls = ["p", "p", "y", "y", "",123]
>>>s = set(ls)
{'p', 'y', 123}
>>>ls = list(s)
['p', 'y', 123]

序列类型及操作

序列类型定义

序列是具有先后关系的一组一维元素向量,元素类型可以不同。
序列:字符串类型、元组类型、列表类型

序列处理函数及方法

s+t:连接两个序列s和t;
s*n:将序列s复制n次;

元组类型及操作

元组是序列类型的一种扩展,一旦创建就不能被修改。使用小括号()或tuple()创建,元素间用逗号分隔。

列表类型及操作

元组是序列类型的一种扩展,创建后可以被随意修改。使用方括号[]或list()创建,元素间用逗号分隔。注意使用=赋值并不是真正的创建,只是将同一个列表贴了另一个标签。
ls[i]=x:替换列表ls的第i个元素为x;
ls[i: j :k]=lt:用列表lt替换ls切片后所对应的元素子列表;
del ls[i]:删除列表ls中第i个元素;
ls+=lt:更新列表ls,将列表lt元素增加到列表ls中;
ls.insert(i,x):在列表ls的第i个位置增加元素x;
ls.pop(i):在列表ls中第i个位置元素取出并删除;
ls.remove(x):将列表ls中出现的第一个元素x删除;
ls.reverse():将列表ls中的元素反转;

序列类型应用场景

数据表示:表示一组有序数据,进而操作它们;
数据保护,不希望数据被程序修改,转换为元组类型;

实例:基本统计值计算

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)))

字典类型及操作

字典类型定义

字典中的映射是一种键(用户自定义索引)和值(数据)的对应。字典是键值对的集合,键值对之间无序,采用大括号{}或者dict()创建,键值对用冒号:表示。

字典处理函数及方法

del d[k]:删除字典d中键k对应的数据值;
d.keys():返回字典d中所有的键信息;
d.values():返回字典d中所有的值信息;
d.items():返回字典d中所有的键值对信息;
d.get(k,):键k存在,返回相应值,不存在则返回值;
d.pop(k,):键k存在,取出相应值,不存在则返回值;

jieba库的使用

-jieba是优秀的中文分词第三方库。
-利用一个中文词库,确定汉字之间的关联概率,概率大的组成词组,形成分词结果。

jieba分词三种模式

精确模式

把文本精确的切分开,不存在冗余单词。
jieba.lcut(s):精确模式,返回一个列表类型的分词结果。

全模式

把文本中所有可能的词语都扫描出来,有冗余。

搜索引擎模式

在精确模式基础上,对长词在此切分。

实例:文本字频统计

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
#CalThreeKingdomsV1.py
import jieba
txt = open("threekingdoms.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
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))
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))

以上。

:转载文章请注明出处,谢谢~