# Python -07 组合数据类型
2018-06-06 本文已影响13人
丿小七
集合类型
集合是多个元素的无序组合
集合类型与数学中的集合概念一致
集合元素之间无序,每个元素唯一,不存在相同元素
# 集合用大括号{}表示,元素间用逗号分隔
# 建立集合类型用{}或set()
# 建立空集合类型,必须使用set()
A = {"1", "123", ("3", "8")}
B = set("pypy123")
>>> {"p", "y", "1", "2", "3"}
- 集合操作符
S|T 并 返回一个新的集合 包括在集合S和T中的所有元素
S-T 差 返回一个新的集合 包括在集合S但不在T中的元素
s&T 交 返回一个新的集合 包括同时在集合S和T中的元素
S^T 补 返回一个新的集合 包括集合S和T中的非相同元素
# 4个增强操作符
S |= T 更新集合S 包括在集合S和T中的所有元素
S -= T 更新集合S 包括在集合S但不在T中的元素
S &= T 更新集合S 包括同时在集合S和T中的元素
S ^= T 更新集合S 包括集合S和T中的非相同元素
- 集合处理方法
S.add(x) 如果x不在集合S中,将x增加到S
S.discard(x) 移除S中元素x,如果x不在集合S中,不报错
S.remove(x) 移除S中元素x,如果x不在集合S中,产生KeyError异常
S.clear() 移除S中所有元素
S.pop() 随机返回S的一个元素,更新S,若S为空产生KeyError异常
S.copy() 返回集合S的一个副本
len(S) 返回集合S的元素个数
X in S 判断S中元素x, x在集合S中,返回
True,否则返回False
set(x) 将其他 类型变量x转变为集合类型
- 应用场景
- 包含关系比较
- 数据去重
序列类型
序列是具有先后关系的一组元素
序列是一个基类类型
# 序列是一维向量,元素类型可以不同
# 类似数学元素序列:S0, S1, ..., Sn-1
# 元素间由序号引导,通过下标访问序列的特定元素
- 序列类型及操作
x in s 如果x是序列s的元素,返回True,否则返回False
x not in s 如果x是序列s的元素,返回False,否则返回True
s + t 连接两个序列s和t
s * n 或 n * s 将序列s复制n次
s[i] 索引,返回s中的第i个元素,i是序列的序号
s[i:j] 或 s[i:j:k] 切片,返回序列s中第i到j以k为步长的元素子序列
- 序列类型通用函数和方法
len(s) # 返回序列s的长度
min(s) # 返回序列s的最小元素,s中元素需要可比较
max(s) # 返回序列s的最大元素,s中元素需要可比较
s.index(x) 或 s.index(x,i,j) # 返回序列s从i开始到j位置中第一次出现元素x的位置
s.count(x) # 返回序列s中出现x的总次数
元组
- 元组是序列类型的一种扩展
- 元组继承序列类型的全部通用操作
元组是一种序列类型,一旦创建就不能被修改
使用小括号()或tuple()创建,元素间用逗号分隔
可以使用或不使用小括号
元组因为创建后不能修改,因此没有特殊操作
列表
- 列表是序列类型的一种扩展,十分常用
- 列表是一种序列类型,创建后可以随意被修改
列表使用[]或list()创建,元素间用逗号分隔
可以使用或不使用小括号
ls = ["cat", "dog", "tiger", 1024]
ls[i] = x 替换列表ls第i元素为x
ls[i:j:k] = lt 用列表lt替换ls切片后对应元素子列表
del ls[i] 删除列表ls中第i元素
del ls[i:j:k] 删除列表ls中第i到第j以k为步长的元素
ls += lt 更新列表ls, 将列表lt元素增加到列表ls中
ls *= n 更新列表ls, 其元素重复n次
序列类型应用场景
- 元组用于元素不改变的应用场景,更多用于固定搭配场景
- 列表更加灵活, 他是最常用的序列类型
- 最主要作用:表示一组有序数据,进而操作他们
- 元素遍历
- 数据保护,如果不希望数据被程序所改变,转换为元组类型
字典类型
映射:映射是一种键(索引)和值(数据)的对应
字典类型是映射的体现
键值对:键是数据索引的扩展
字典是键值对的集合,键值对之间无序
采用{}和dict()创建,键值对用冒号:表示
d = {"中国":"湖南", "名字":"小七"}
-
字典类型操作函数喝方法
del d[k] 删除字典d中键对应的数据值 k in d 判断键k是否在字典d中,如果在返回True,否则返回False d.keys() 返回字典d中所有的键信息 d.values() 返回字典d中所有的值信息 d.items() 返回字典d中所有的键值对信息 d.get(k, <default>) 键k存在,则返回相应值,不在则返回<default>值 d.pop(k, <default>) 键k存在,则取出相应值,不在则返回<default>值 d.popitem() 随机从字典d中取出一个键值对,以元组形式返回 d.clear() 删除所有键值对 len(d) 返回字典d中元素的个数
jieba库
jieba库是优秀的中文分词第三方库
cmd命令行: pip install jieba
利用一个中文词库,确定汉字之间的关联概率
- 精确模式
把文本精确的切分开,不存在冗余单词
- 全模式
把文本中所有可能的词语都扫描出来,有冗余
- 搜索引擎模式
在精确模式基础上,对长词再次切分
函数 | 描述 |
---|---|
jieba.lcut(s) | 精确模式,返回一个列表类型的分词结果 jieba.lcut(“中国是一个伟大的国家")==>[“中国”, ‘是’, “一个”, “伟大”, “的”, “国家"] |
jieba.lcut(s,cut_all=True) | 全模式,返回一个列表类型的分词结果,存在冗余 jieba.lcut(“中国是一个伟大的国家”, cut_all=True)==>[“中国”, “国是”, “一个”, “伟大”, “的”, “国家"] |
jieba.lcut_for_search(s) | 搜索引擎模式,返回一个列表类型的分词结果,存在冗余 jieba.lcut_for_search(“中华人民共和国是伟大的”)==>[“中华”, “华人”, “人民”, “共和”, “共和国”, “中华人民共和国", "是", "伟大", "的"] |
jieba.add_word(w) | 向分词词典增加新词w jieba.add_word("蟒蛇语言") |
jieba.lcut("中国是一个伟大的国家")
# [“中国”, ‘是’, “一个”, “伟大”, “的”, “国家"]
jieba.lcut("中国是一个伟大的国家", cut_all = True)
# [“中国”, “国是”, “一个”, “伟大”, “的”, “国家"]
jieba.lcut_for_search("中华人民共和国是伟大的")
# [“中华”, “华人”, “人民”, “共和”, “共和国”, “中华人民共和国", "是", "伟大", "的"]
jieba.add_word("蟒蛇语言")
# 增加新词
文本词频统计
# 文本词频统计
import sys
def getText():
txt = open("hamlet.txt", "r").read()
# 打开文本文件,测试可以使用txt='''很长的文本内容,英文类型的文本代替'''
# 使用PyCharm工具编译
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))
Pycharm安装:PyCharm安装激活
运行结果
屏幕快照 2018-06-06 18.10.23.png
PyInstaller库
将.py
源代码转换成无需源代码的可执行文件
参数 | 描述 |
---|---|
-h | 查看帮助 |
--clean | 清理打包过程中的临时文件 |
-D, --onedir | 默认值,生成dist文件夹 |
-F, --onefile | 在dist文件夹中生成独立的打包文件 |
-i<图标文件名.ico> | 指定打包程序使用的图标icon文件 |