# 使用{}建立集合 >>> A ={"python",123,("python",123)}{123,'python',('python',123)}# 使用set()建立集合>>> B =set("pypy123"){'1','p','2','3','y'}>>>> C ={"python",123,"python",123}{'python',123}
集合操作符
6个操作符
操作符及应用
描述
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的包含关系
4个增强操作符
操作符及应用
描述
S |= T
更新集合S,包括在集合S和T中的所有元素
S -= T
更新集合S,包括在集合S但不在T中的所有元素
S &= T
更新集合S,包括同时在集合S和T中的元素
S ^= T
更新集合S,包括集合S和T中的非相同元素
>>> A ={"p","y",123}>>> B =set("pypy123")>>> A - B
{123}>>> B - A
{'3','1','2'}>>> A & B
{'p','y'}>>> A | B
{'1','p','2','y','3',123}
集合处理方法
操作函数或方法
描述
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
x not in S
判断S中元素x,x不在集合S中,返回True,否则返回False
set(x)
将其他类型变量x转变为集合类型
>>> A ={"p","y",123}>>>for item in A:print(item, end="")# p123y# 集合中取出元素时,可能与定义的顺序不同>>>try:whileTrue:print(A.pop(), end="")except:pass# p123y# 不断取出集合A中的元素,直至A为空>>> A
set()
>>> ls =["cat","dog","tiger",1024]>>> lt =tuple(ls)>>> lt
("cat","dog","tiger",1024)
6.3 实例9: 基本统计值计算
“基本统计值计算”问题分析
需求:给出一组数,对他们有个概要理解
该怎么做呢?
总个数:len()
求和:for … in
平均值:求和/总个数
方差:各数据与平均数差的平方的和的平均数
中位数:排序,然后奇数找中间1个,偶数找中间2个取平均
“基本统计值计算”实例讲解
# CalStatisticsV1.py# 获取用户不定长度的输入defgetNum():
nums =[]
iNumStr =input("请输入数字(回车退出):")while iNumStr !="":
nums.append(eval(iNumStr))
iNumStr =input("请输入数字(回车退出):")return nums
# 计算平均值defmean(numbers):
s =0.0for num in numbers:
s = s + num
return s /len(numbers)# 计算方差defdev(numbers, mean):
sdev =0.0for num in numbers:
sdev = sdev +(num - mean)**2returnpow(sdev /(len(numbers)-1),0.5)# 计算中位数defmedian(numbers):sorted(numbers)
size =len(numbers)# 整除向下取整if size %2==0:
med =(numbers[size//2-1]+ numbers[size//2])/2else:
med = numbers[size//2]return med
# 调用函数
n = getNum()
m = mean(n)print("平均值:{},方差:{},中位数:{}。".format(m, dev(n, m), median(n)))
# CalHamletV1.pydefgetText():
txt =open("hamlet.txt","r").read()
txt = txt.lower()for ch in'!"#$%&()*+,-./:;<=>?@[\\]^_‘{|}~':
txt = txt.replace(ch," ")#将文本中特殊字符替换为空格return txt
hamletTxt = getText()# 以空格为分隔符,包含 \n,返回分割后的字符串列表
words = hamletTxt.split()
counts ={}for word in words:
counts[word]= counts.get(word,0)+1
items =list(counts.items())# lambda函数:返回函数名来作为结果,是一种匿名函数,没有名字,使用lambda保留字定义,函数名是返回结果# 用于定义简单的,能够在一行内表示的函数# 用法:<函数名>=lambda<参数>:<表达式># sort()函数默认升序
items.sort(key=lambda x:x[1], reverse=True)for i inrange(10):
word, count = items[i]print("{0:<10}{1:>5}".format(word, count))
“《三国演义》人物出场统计”实例讲解
# CalThreeKingdomsV1.py# 并不能完成人物出场统计,只能是统计文章中分词的出现频率import jieba
txt =open("threekingdoms.txt","r", encoding='utf-8').read()
words = jieba.lcut(txt)
counts ={}for word in words:# 如果word的长度为1,即只有一个字iflen(word)==1:continueelse:
counts[word]= counts.get(word,0)+1
items =list(counts.items())
items.sort(key=lambda x:x[1], reverse=True)for i inrange(15):
word, count = items[i]print("{0:<10}{1:>5}".format(word, count))
# CalThreeKingdomsV2.py# 需要根据词频结果不断优化import jieba
# excludes中不是人名,但词频排名靠前
excludes ={"将军","却说","荆州","二人","不可","不能","如此"}
txt =open("threekingdoms.txt","r", encoding='utf-8').read()
words = jieba.lcut(txt)
counts ={}# 名称关联for word in words:iflen(word)==1:continueelif 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)+1for word in excludes:del counts[word]
items =list(counts.items())
items.sort(key=lambda x:x[1], reverse=True)for i inrange(10):
word, count = items[i]print("{0:<10}{1:>5}".format(word, count))