集合是多个元素的无序组合
集合类型与数学中集合概念一致
集合元素之间无序,每个元素唯一,不存在相同元素
集合元素不可修改,不能是可变数据类型
集合用{}表示,元素之间用逗号分隔
建立集合类型用{}或set()
建立空集合类型,必须使用set()
集合间有多种操作,常见集合间运算分别为并(|)、交(&)、差(-)、补(^)运算
Python集合有多种集合间运算,以下是常见的集合间运算:
并集:使用 |
或 union()
方法。将两个集合中的所有元素合并成一个集合,不会重复。
set1 = {1, 2, 3}
set2 = {3, 4, 5}
set3 = set1 | set2
# 或者
set4 = set1.union(set2)
print(set3) # {1, 2, 3, 4, 5}
print(set4) # {1, 2, 3, 4, 5}
交集:使用 &
或 intersection()
方法。返回两个集合中都包含的元素组成的集合。
set1 = {1, 2, 3}
set2 = {3, 4, 5}
set3 = set1 & set2
# 或者
set4 = set1.intersection(set2)
print(set3) # {3}
print(set4) # {3}
差集:使用 -
或 difference()
方法。返回第一个集合中有但第二个集合中没有的元素组成的集合。
set1 = {1, 2, 3}
set2 = {3, 4, 5}
set3 = set1 - set2
# 或者
set4 = set1.difference(set2)
print(set3) # {1, 2}
print(set4) # {1, 2}
补集:使用 ^
或 symmetric_difference()
方法。返回两个集合中不同的元素组成的集合。
set1 = {1, 2, 3}
set2 = {3, 4, 5}
set3 = set1 ^ set2
# 或者
set4 = set1.symmetric_difference(set2)
print(set3) # {1, 2, 4, 5}
print(set4) # {1, 2, 4, 5}
这些集合间运算都是基于集合的数学概念而来,可以方便地处理集合中的元素。
除此之外还有(<=、<、>=、>)判断子集关系或包含关系
数据去重:集合类型的元素不重复,可用于去除列表等其他集合类型中的重复元素。
ls = ["p", "p", "y", "y", 123]
s = set(ls)
print(s)
lt = list(s)
print(s)
# 输出
{'p', 123, 'y'}
{'p', 123, 'y'}
其他场景还有包括:
序列是具有先后关系的一组元素
序列是一个基类类型,不会直接使用序列类型,而是使用他的衍生类型:字符串类型、元组类型、列表类型
在Python中,序列类型的序号从0开始,表示序列中的第一个元素。例如,对于一个包含3个元素的列表,第一个元素的序号为0,第二个元素的序号为1,第三个元素的序号为2。可以使用方括号索引来获取序列中的特定元素,例如:
my_list = [1, 2, 3]
print(my_list[0]) # 输出1
print(my_list[1]) # 输出2
print(my_list[2]) # 输出3
反向从(-1)开始
Python中序列类型操作符包括:
这些操作符的含义和使用方法可以根据具体的序列类型(如字符串、列表、元组等)来进行理解和应用。
序列类型中通用函数及方法:
通用函数:
方法:
元组是序列类型的一种扩展
元组类型操作:
元组继承序列类型的全部通用操作
列表是序列类型的一种扩展,十分常用
示例:定义一个列表
ls = ["cat", "dog", "tiger", 1024]
print(ls)
lt = ls
# 输出
['cat', 'dog', 'tiger', 1024]
['cat', 'dog', 'tiger', 1024]
此时lt并没有生成一个新列表,而是给ls列表增加一个名称
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 = ["cat", "dog", "tiger", 1024]
print(ls)
ls[1:2] = [1, 2, 3, 4]
print(ls)
del ls[::3]
print(ls)
print(ls*2)
# 输出
['cat', 'dog', 'tiger', 1024]
['cat', 1, 2, 3, 4, 'tiger', 1024]
[1, 2, 4, 'tiger']
[1, 2, 4, 'tiger', 1, 2, 4, 'tiger']
列表类型操作函数和方法:
ls.append(x):在列表ls最后增加一个元素x
ls.clear():删除列表ls中所有元素
ls.copy():生成一个新列表,赋值ls中所有元素
ls.insert(i,x):在列表ls的第i位置增加元素x
ls.pop(i):将列表ls中第i位置元素取出并删除该元素
ls.remove(x):将列表ls中出现的第一个元素x删除
ls.reverse():将列表ls中的元素反转
示例:
ls = ["cat", "dog", "tiger", 1024]
print(ls)
ls.append(1234)
print(ls)
ls.insert(3, "human")
print(ls)
ls.reverse()
print(ls)
# 输出
['cat', 'dog', 'tiger', 1024]
['cat', 'dog', 'tiger', 1024, 1234]
['cat', 'dog', 'tiger', 'human', 1024, 1234]
[1234, 1024, 'human', 'tiger', 'dog', 'cat']
序列包括元组、列表两种重要的扩展类型
序列类型应用场景:
基本统计值:
总个数,求和,平均值,方差,中位数
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()
创建,键值对用:
表示d = {"中国":"北京", "美国":"华盛顿"}
print(d)
# 输出
{'中国': '北京', '美国': '华盛顿'}
函数及方法:
del d[k]:删除字典d中键k对应的数据值
k in d:判断键k是否在字典d中,如果在返回true,否则返回false
d.keys():返回字典d中所有的键信息
d.values():返回字典d中所有的值信息
d.items():返回字典d中所有的键值对信息
示例:
d = {"中国":"北京", "美国":"华盛顿"}
print(d)
print("中国" in d)
print(d.keys())
# 输出
{'中国': '北京', '美国': '华盛顿'}
True
dict_keys(['中国', '美国'])
dict_values(['北京', '华盛顿'])
列表类型操作函数和方法:
d.get(k, ):键k存在,则返回相应值,不在则返回值
d.pop(k, ):键k存在,则取出相应值,不在则返回值
d.popitem():随机从字典d中取出一个键值对,以元组形式返回
d.clear():删除所有键值对
示例:
d = {"中国":"北京", "美国":"华盛顿"}
print(d.get("中国", "汉堡包"))
print(d.get("炸薯条", "汉堡包"))
# 输出
北京
汉堡包
('美国', '华盛顿')
映射的表达:
jieba是优秀的中文分词第三方库
安装:在终端运行
pip install jieba
jieba分词需要依靠中文词库
jieba分词有三种模式
jieba库常用函数:
jieba.cut(s): 分词函数,将文本分成一个个词语并返回一个可迭代的generator对象。
jieba.lcut(s): 精确模式,返回一个列表,包含分词结果中的所有词语。
jieba.lcut(s,cut_all=True):全模式,返回一个列表类型的分词结果,存在冗余
jieba.lcut_for_search(s): 适用于搜索引擎的分词函数,粒度比较细。
jieba.add_word(s): 向词典中添加新词。
文本词频统计
需求:一篇文章,出现了哪些词?哪些词出现的最多?
https://www.python123.io/resources/pye/hamlet.txt
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))
https://www.python123.io/resources/pye/threekingdoms.txt
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))