python06---第六章:组合数据类型(序列集合映射、统计值计算、文本词频统计)(jieba库 pip命令安装库)


一、组合数据类型,分为三类:

序列类型:字符串(str “”)、元组(tuple ())、列表(list [])

  • 集合类型:集合(set {})
  • 映射类型:字典(map)

可变数据类型:列表 集合 字典
不可变数据类型:字符串 元组

1.序列类型:字符串(str [])、元组(tuple ())、列表(list [])

(1)元组:
元组类型,一旦创建不可修改。

creature="cat","dog","tiger","human"
print(creature)
creature[-1]=[]  #错误操作
print(creature)

结果显示:
('cat', 'dog', 'tiger', 'human')
creature[-1]=[]
TypeError: 'tuple' object does not support item assignment
creature="cat","dog","tiger","human"
print(creature)
color=("red","0x001100","blue",creature)#元组类型采用逗号和圆括号表示,圆括号可选
print(color)
print(color[-1][2])

结果显示:
('cat', 'dog', 'tiger', 'human')
('red', '0x001100', 'blue', ('cat', 'dog', 'tiger', 'human'))
tiger

元组,可多变量同步赋值。

a,b="dog","tiger"
print(a,b)
a,b=b,a
print(a,b)

结果显示:
dog tiger
tiger dog

(2)列表:

  • 有序数列
  • 其长度和内容可变(增删)

list()函数:可将元组或字符串转换成列表。

ls=[425,"BIT",[10,"CS"],425]
print(ls)
print(ls[2][-1][0])
print(list("中国是一个伟大的国家"))
print(list())#返回一个空列表

结果显示:
[425, 'BIT', [10, 'CS'], 425]
C
['中', '国', '是', '一', '个', '伟', '大', '的', '国', '家']
[]

(3)元组和序列的区别:
元组与列表是非常类似的,区别在于元组的元素值不能修改,元组是放在括号中,列表是放于方括号中
a.list()函数将元组转换为列表。

2. 集合类型 {}:

无序组合(无索引和位置概念)

  • 集合中的元素不可重复(可动态增加、删除)
  • 元素类型为固定(不可更改)数据类型(整数浮点数字符串元组,因列表 集合 字典为可变数据类型。)

创建集合:

#法一:
S={425,"BIT",(10,"CS"),424,"BIT"}
print(S)

#法二:由set()函数生成
W=set("apple")
print(W)
V=set(("cat","dog","tiger","human"))
print(V)

结果显示:
{424, 425, (10, 'CS'), 'BIT'}
{'e', 'l', 'p', 'a'}
{'human', 'dog', 'cat', 'tiger'}

3. 映射类型(字典):

映射类型是“键-值”数据项的组合,每个元素是一个键值对(key,value)(属性与值得映射)

  • 字典是集合类型的延续,无序。
  • 使用大括号,创建字典{}或dict()。
  • 使用中括号,增加新元素。
{<1>:<1>,<2>:<2>,……,<键n>:<值n>}
 country_city={"中国":"北京","美国":"华盛顿","法国":"巴黎"}
print(country_city)
#{'中国': '北京', '美国': '华盛顿', '法国': '巴黎'}
print(country_city["中国"])
#北京
country_city["英国"]="伦敦"
print(country_city)
#{'中国': '北京', '美国': '华盛顿', '法国': '巴黎', '英国': '伦敦'}
country_city.keys()
#dict_keys(['中国', '美国', '法国', '英国'])
country_city.values()
#dict_values(['北京', '华盛顿', '巴黎', '伦敦'])
country_city.items()
#dict_items([('中国', '北京'), ('美国', '华盛顿'), ('法国', '巴黎'), ('英国', '伦敦')])
for key in country_city:
	print(key)
#中国
#美国
#法国
#英国

二、实例:基本统计值计算

计算平均值、方差、中位数

for num in nums:  ##表示 num为nums中的元素,从中遍历(而不需下标)
import math
#依次获取用户输入的数字
def GetNum():
    nums=[]
    iNumStr=input("请输入数字(直接输入回车退出):")
    while iNumStr != "":#中间没有空格,表示回车退出
        nums.append(eval(iNumStr))
        iNumStr=input("请输入数字(直接输入回车退出):")
    return nums

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

#计算方差
def dev(nums,nums_mean):
    nums_dev_=0.0
    for num in nums:
        nums_dev_ += (num-nums_mean)**2
    nums_dev=math.sqrt(nums_dev_/len(nums))
    return nums_dev

#计算中位数
def median(nums):
    if len(nums)%2 == 0:
        nums_median=(nums[len(nums)//2-1]+num[len(nums)//2])/2
    else:
        nums_median=nums[len(nums)//2]
    return nums_median

#主函数:
number=GetNum()
print("数据:{}\n平均值:{}\n方差:{:.1f}\n中位数:{}".format\
      (number,mean(number),dev(number,mean(number)),median(number)))
print(len(number))

结果显示:
请输入数字(直接输入回车退出):99
请输入数字(直接输入回车退出):98
请输入数字(直接输入回车退出):97
请输入数字(直接输入回车退出):96
请输入数字(直接输入回车退出):95
请输入数字(直接输入回车退出):
数据:[99, 98, 97, 96, 95]
平均值:97.0
方差:1.4
中位数:97
5

三、jieba库

jieba是python中的第三方中文分词函数库

1.pip指令安装jieba库

进入管理员权限,并执行 pip3 install jieba
C:\WINDOWS\system32>pip3 install jieba
若加载时间过长,使用如下命令:(因为服务器在国外)
C:\WINDOWS\system32>pip3 install jieba -i https://pypi.tuna.tsinghua.edu.cn/simple

安装指定版本:pip3 install numpy-1.9.2
卸载使用:pip3 uninstall jieba
升级:pip3 install -U numpy

2.jieba支持3种分词模式 :

精确模式:精确切开句子
-全模式:扫描所有可以成词的词语(冗余多)
-搜索引擎模式:在精确模式的基础上,对长词再次切分。
在这里插入图片描述

import jieba
print(jieba.lcut("中华人民共和国是一个伟大的国家"))
print(jieba.lcut("中华人民共和国是一个伟大的国家",cut_all=True))
print(jieba.lcut_for_search("中华人们共和国是一个伟大的国家"))

结果显示:
['中华人民共和国', '是', '一个', '伟大', '的', '国家']
['中华', '中华人民', '中华人民共和国', '华人', '人民', '人民共和国', '共和', '共和国', '国是', '一个', '伟大', '的', '国家']
['中华', '人们', '共和', '共和国', '是', '一个', '伟大', '的', '国家']

四、实例:文本词频统计

1.hamlet词频统计:

文本下载链接:https://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()#该函数采用空格对字符串中的信息进行分隔,并以列表格式返回给变量
                       #words 是列表类型,以空格间隔

counts={}#创建字典类型,单词和出现次数构成字典类型(映射)
for word in words:
    counts[word]=counts.get(word,0)+1  #键:word  值:出现次数
    ''' 等价于:
    if word in counts:
        counts[word]=counts[word]+1
    else:
        counts[word]=1#表示该词第一次出现

    '''

#移除部分词(介词 冠词等等)
excludes={"the","and","of","you","a","i","my","in"}
for word in excludes:
    del(counts[word])
    

#进行排序
items=list(counts.items())                  #将字典类型(无序)转换为列表类型进行排序
items.sort(key=lambda x:x[1],reverse=True)
                                            #reverse=True表示从大到小排序,默认为从小到大
                                            #sort中的lambda用来表示,使用item中的哪一个多元选项的列表作为排序列
                                            #此处,表示按照键值对的值进行排序
for i in range(10):
    word,count=items[i]
    print("{0:<10}{1:>5}".format(word,count))

结果显示:
to          744
hamlet      470
it          418
that        404
is          356
not         313
lord        310
his         296
this        296
but         270

2.《三国演义》人物出场统计:

文本链接:https://python123.io/resources/pye/threekingdoms.txt

import jieba
#获取文本
txt=open("threekingdoms.txt","r",encoding='utf-8').read()
words=jieba.lcut(txt)
    #for ch in "~!@#$%^&*()_+=-—[||]|\{}[]':;<>,.。,、/`·":
    #    ch=" "

#创建字典类型
counts={}#counts[word,count] 键值对
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
        
#移除部分词
excludes={"将军","却说","荆州","二人","不可","不能","如此","如何"}
for word in excludes:
    del(counts[word])

#将字典类型转换为列表类型,并进行排序输出
items=list(counts.items())
items.sort(key=lambda x:x[1],reverse=True)
for i in range(5):
    word,count=items[i]
    print("{0:<10}{1:>5}".format(word,count))

结果显示:
曹操         1451
诸葛亮        1383
刘备         1252
关羽          784
张飞          358
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值