组合数据类型——元组列表集合映射,含词频统计做法
admin
2024-02-13 14:52:19
0

python 组合数据类型

序列类型: 字符串str,元组tuple 列表list
正向序号:01234;反向:-1(倒数第一个) -2…
操作符:
s*n:序列s复制n次
s.index(x[,i[,j]]): 序列s中从i位置到j位置中间第一次出现x的位置
s.count(x) : 序列中出现x的总次数

元组类型

元组一旦创建就不能被修改。一般用于表达固定数据项、函数返回值、多变量同时赋值、循环遍历等情况。
创建:

tuple([1,2,3])
tuple('python')
st = 'num','name','job'
course = ('math','english','sport')
info = ('name','num','job',course)

列表类型

与元组不同,列表的长度和内容都是可变的,可自由对列表中的数据项进行增加、删除或替换。列表没有长度限制,元素的类型可以各不相同。

  1. 创建
list('python')
# ['p','y','t','h','o','n']
tp = (1,2,3)
list(tp)
# [1,2,3]
ls = [11,'aa',['red','green']]
# ls[2][0]  --->'red' 
  1. 列表操作
    简单将一个列表赋值给另一个列表是不会生成新的列表对象的,而是将两个变量指向了同一个列表。只有通过list()或
    [ ]创建才会生成新列表.
# 简单赋值的后果,改1变2
ls = [11,'22',['red','green']]
lt  = ls
ls[1] = 'ppp'
# 打印lt 得到:[11,'ppp',['red','green']]

如果非要将一个列表的值赋给另一个变量,可通过复制的方式实现:

ls = [11,'22',['red','green']]
# 生成新列表,复制ls中所有元素
lt = ls.copy()
ls[1] = 'ppp'
# # 打印lt 得到:[11,'22',['red','green']]

操作符:
ls.extend(lt) 或者 ls+=lt :将lt元素加到列表ls中
ls+=n:更新列表ls,元素重复n次
ls.pop(i):列表ls中第i个元素取出并删除,返回剩下的列表ls
ls.remove(x) :删列表的元素,返回剩下的ls (注意pop,remove传的参数不一样!)

增删改查操作

lt = ['cat', 'dog', 'tiger', 111]
lt[1:2] = [1, 2, 3, 4]
print('此时lt:', lt)
# "初始:结束:步长" 删除部分包括初始和结束
del lt[::3]
print('删除后此时lt:', lt)
#  更新需要=;如果只是lt*2打印内容并未更新lt
lt *= 2
print('乘2后此时lt:', lt)
lt += ['a', 'b', 'c', 'd', 'e']
print('增加后此时lt:', lt)

打印结果:

此时lt: ['cat', 1, 2, 3, 4, 'tiger', 111]
删除后此时lt: [1, 2, 4, 'tiger']
乘2后此时lt: [1, 2, 4, 'tiger', 1, 2, 4, 'tiger']
增加后此时lt: [1, 2, 4, 'tiger', 1, 2, 4, 'tiger', 'a', 'b', 'c', 'd', 'e']

对元素操作:

ls = [1, 2, 3, 4, 5, 6, 7]
ls.append(10)
print('+10以后此时ls:', ls)
# 在1位置插入30
ls.insert(1, 30)
print('插值后ls:', ls)
ls.reverse()
print('反转后ls:', ls)
ls.sort()
print('排序后ls:', ls)
ls.sort(reverse=True)
print('降序排序后ls:', ls)
sum(ls)
print('ls求和:', sum(ls))

结果:

+10以后此时ls: [1, 2, 3, 4, 5, 6, 7, 10]
插值后ls: [1, 30, 2, 3, 4, 5, 6, 7, 10]
反转后ls: [10, 7, 6, 5, 4, 3, 2, 30, 1]
排序后ls: [1, 2, 3, 4, 5, 6, 7, 10, 30]
降序排序后ls: [30, 10, 7, 6, 5, 4, 3, 2, 1]
ls求和: 68

列表元素遍历
注意:

  • 如果对元素访问时不需要删除操作,则可直接遍历列表。
  • 如果对元素访问时涉及删除或改变元素位置等操作,则应先对原列表进行复制,在复制的列表中遍历,而在原列表中操作,这样可以保证每个元素都能被遍历并进行操作。

例:对列表元素求平均值
分析:对列表中的每个元素进行访问,对它们的值进行累加,再将累加结果除以列表长度即可得到列表的平均值。在这个过程中,不需要改变元素的位置,可以直接对列表进行遍历

ls = [1, 2, 3, 4]
sum = 0
for i in ls:sum+=i
print('列表元素平均值:',sum/len(ls))

例:删除3的倍数。
指定列表[23,45,78,87,11,67,89,13,243,56,67,311,431,111,141]中,请将其中所有为3的倍数的元素删除,并输出剩余的元素及删除元素的个数
分析:。一旦涉及元素的删除,就会导致列表的元素索引号发生改变,为保证每个元素都能被遍历,故需要先复制列表,在复制的列表中遍历,在原列表中删除。
代码:

ls = [23, 45, 78, 87, 11, 67, 89, 13, 243, 56, 67, 311, 431, 111, 141]
lt = ls.copy()
count = 0
print('删除后列表元素是', end=' ')
for i in lt:if i % 3 == 0:ls.remove(i)count += 1else:# 注意end里 空格print(i, end=' ')
print('\n 一共删除{}个元素'.format(count))

结果:

删除后列表元素是 23 11 67 89 13 56 67 311 431一共删除6个元素

集合类型

  • 集合中的元素不可重复,元素类型只能是固定数据类型,不能是可变数据类型。
    如整数、浮点数、字符串、元组等可以作为集合的数据项,而列表、字典和集合类型则不能作为集合的元素出现
  • 集合是无序的组合,没有索引和位置的概念,不能分片,集合中的元素可以动态增加或删除。
  • 由于集合中的元素都是唯一的,可以使用集合类型过滤重复元素。
s1 = {100, 'fff', 20.6}
print('{}方式创建的s1:', s1)
# set()参数为字符串
s2 = set('python')
print('set方式创建的s2:', s2)
# set() 参数为元组
s3 = set(('python', 123))
print('set方式创建的s3:', s3)

结果:

{}方式创建的s1: {'fff', 100, 20.6}
set方式创建的s2: {'o', 't', 'n', 'h', 'p', 'y'}
set方式创建的s3: {'python', 123}

注意:空集合只能由set()函数创建。空{}创建的集合默认为字典类型

映射类型

映射类型是键-值数据项的组合,每一个元素都是一个键-值对,即元素是(key,value),元素之间是无序的。键-值对(key,value)是一种二元关系,源于属性和值的映射关系.这种通过任意键信息查找一组数据中值信息的过程称为映射,在Python中,映射类型主要以字典(dict)进行体现.

  1. 字典创建
  • 字典是包含0个或多个键-值对的无序集合,没有长度限制,可以根据键索引值的内容,且键具有唯一性。
  • 创建方式:dict()来创建空字典,也可以通过大括号{}来创建
    注意:字典输出数据的顺序可能与创建之初的顺序不一致。其原因是字典是集合类型的延续,所以各元素之间没有顺序之分,如果想保持一个集合中各元素的顺序,需要使用列表。
  1. 字典操作
    d.keys() :返回所有键信息;
    d.values() : 返回所有值信息
    d.items() : 返回所有键-值对
    d.get(key,default): 键存在返回相应的值,不存在返回默认值 (注意:传入的是key,返回的是value!)
    del d[key] :删除字典d中某一个键-值对
    注意:
    如果希望以keys()、values()、items()方法返回列表类型,可用list()函数进行转换

  2. 字典遍历

例:计算消费额
小明在咖啡店里点了双人下午套餐,包含两杯咖啡和两份点心:一杯卡布奇诺32元,一杯摩卡30元,一份抹茶蛋糕28元,一份布朗尼蛋糕36元,请帮忙用Python计算并输出消费总额

menu = {'coffee': 38, 'coffee2': 30, 'cake': 28, 'cake2': 26}
total = 0
for key in menu:total += menu[key]
print('一共消费{}元'.format(total))

例:词频统计
词频统计本质就是词语数量的累加问题,对每个词语设计一个计数器,每出现一次,相应地计数器就加1。因为一篇文章中的词语量比较大,为避免词语计数器发生混乱,可以将词语与相应的计数器组成一对键-值
步骤:
第1步,获取英文文本。内容存储在文本文件中,此处需要用到后续博客的文件打开与读取方法。打开文件:open(文件名,打开方式),读取全文:read()。
第2步,统一大小写。由于同一个单词会存在大小写不同的形式,但计数时应该不区分大小写,将它们归为一个单词。统一转换为小写:lower()。
第3步,去掉标点符号。标点符号不参与计数,为避免标点符号对分词造成影响,需要将原文中的各类标点符号用replace()方法替换成空格。
第4步,提取单词。利用相应的方法将单词进行分解并提前,英文文本以空格或标点符号来分隔词语,获得单词并统计数量相对容易。统一用空格来分离单词:split()。
第5步,创建字典,用于存储词语及对应的计数器。
第6步,遍历文本,对计数器值进行修改。计数器值的变化就是对值进行修改,而修改是在原有的基础上进行加1,则可以使用字典的
“d.get(key,default)+1”方式实现,如果词语在字典中已存在,则获得原有值,在这个值的基础上加1,如果这个词语不存在,则将它的默认值设为0,表示第1次出现。
第7步,字典转换为列表,按词频排序。由于字典是无序的,如果要显示词频最高的词语,需要先转换为序类型,才能实现排序。转换函数:list(),排序函数:sort(),字典转换为列表后是一个二元关系,即二维列表,排序需要使用key属性,使用lambda函数指定排序的依据。
第8步,遍历列表,输出词语及词频。按需要将前10个高频词及次数输出。

代码:

# 词频统计
def get_text():file = open()text = file.read()text = text.lower()for char in '!"#$%&()*+,-./:;<=>?@[\\\\]^_`{|}~':text = text.replace(char, ' ')return texttxt = get_text()
words = txt.split()
counts = {}
for w in words:counts[w] = counts.get(w, 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("{:<12}{:>5}".format(word, count))

相关内容

热门资讯

哈易购APP非法期货交易欺骗投...   哈易购APP宣传可做白银铂金贵金属订购交易,但实际上并没有取得相关交易资质!哈易购APP本质上就...
消息称百度旗下昆仑芯瞄准500... 6 月 29 日消息,据《The Information》昨日援引知情人士消息,百度旗下 AI 芯片...
打造夏日消费新场景 第35届北... 北京商报讯(记者 翟枫瑞)6月29日消息,第35届北京国际燕京啤酒文化节新闻发布会在京举行。本届啤酒...
社保基金持仓数据出炉,一季度增... 最近各大上市公司一季度财报都公开了,咱们国家社保基金的持仓数据也全部曝光。目前社保拿着比亚迪价值44...
36氪首发 | 海思、中兴团队... 作者 | 乔钰杰 编辑 | 袁斯来 硬氪获悉,广州宸思通讯科技有限公司(以下简称“宸思科技”)近日完...
两天蒸发47亿市值!一纸税务通... 一纸税务通知书,能让一家百亿龙头两天蒸发47亿市值。 6月22日,北大荒(600598.SH)公告称...
SK海力士将投资1100万亿韩... SK集团会长崔泰源6月29日在韩国“三大重大计划”发布会上宣布,公司将投资1100万亿韩元扩大半导体...
两只A股,终止上市! 两家A股公司,即将摘牌。 6月29日,退市沪科(600608.SH)公告称,上海证券交易所将在202...
原创 M... 一家成立近十年的自动驾驶公司,在IPO时吸引了14家基石投资者认购近一半的发行股份,其中不乏奔驰、比...
基金忠言|国寿安保滤镜碎,三年... 图片来源:视觉中国 蓝鲸新闻6月29日讯(记者 祁和忠)保险系基金公司国寿安保总经理换人了。 6月2...
三星电机计划加码玻璃基板!相关... 6月29日,玻璃基板概念股午后有所回升, 华工科技(000988.SZ)逼近涨停, 彩虹股份(600...
拉萨海关持续壮大外贸经营主体 ...   新华网拉萨6月28日电(记者蒋梦辰)近日,记者从拉萨海关获悉,今年前5个月,西藏有进出口实绩的外...
机构:二季报临近,医药生物板块... 6月29日,华源证券发布了一篇医药生物行业的研究报告,报告指出,业绩期临近,产业链景气度有望再次迎来...
每日收评科创50放量涨超4.5... 财联社6月29日讯,三大指数全线收红,创业板指探底回升,科创50指数大涨4.61%。沪深两市成交额3...
6月多地土拍结构性升温:深圳单... 进入2026年6月,不少城市核心区地块集中诞生高溢价宗地,热度突出的城市包含深圳、杭州、长沙。 其中...
业绩炸裂!盛达资源半年预盈3.... 6月29日,贵金属矿山龙头盛达资源(000603.SZ)发布 2026 年半年度业绩预告,上半年业绩...
A股午后拉升三大股指收涨:半导... A股三大股指6月29日开盘涨跌互现。早盘沪强深弱,创指一度跌超2%。半导体午后拉升,带动两市上涨,沪...
原创 空... 前言 大家好,我是老金。 这几天,两幅极度割裂的画面放在一起,把我看笑了。 一边是在持续的热浪下,欧...
澳大利亚审慎监管局拟放宽银行风... 澳大利亚审慎监管局(APRA)6月29日就修改 银行信用风险资本设定公开征求意见,旨在加大信贷投放以...