Python数据结构(python数据结构与算法分析第3版答案)
off999 2024-09-14 07:18 32 浏览 0 评论
使用Python做数据挖掘已经两年多了,在处理数据的过程中经常会使用到一些数据结构,比如,列表、元组、集合、字典,虽然经常用,但是老是记不住他们常用的一些函数和方法,那就趁此机会整理一下
注:文章内容根据小甲鱼的《零基础入门学习Python》课程而整理
列表
一:创建列表 :列表中元素以逗号隔开并且以中括号将他们括起来
在Python中列表的含义和其他程序语言中的数组类似,由一系列元素组成并且可以通过下标进行访问。不同的是,列表里面的元素可以是任何数据类型,甚至可以是一个列表。
1)创建一个纯由字符串组成的列表,并赋值给变量member
member = ['小甲鱼','黑夜','牡丹','怡静']
2)创建一个混合列表,列表内的元素有数字,字符串和纯数字列表,并将其赋值给变量mix
mix = ['小甲鱼',120,[3,2,1]]
3)创建一个空列表,并将其赋值给变量empty:
empty = []
二:通过列表相关函数向列表内添加新元素
在这里我们主要介绍列表的三个函数 append() extent() insert()并举实例介绍它们的用法
1) append()函数
append()函数需要一个参数,该参数将作为一个元素加入到列表的末尾,这种方法一次只能加一个元素
member = ['小甲鱼','黑夜','牡丹','怡静']
>>>member.append('青牛')
>>>member
['小甲鱼','黑夜','牡丹','怡静','青牛']
2) extend()函数,实现了一次性加入多个元素
这个参数是一个列表,通过这个函数可以将此列表内的元素加到列表末尾,调用方式为 列list.extend(newlist)
member = ['小甲鱼','黑夜','牡丹','怡静']
newlist = ['醉酒','John_farmer']
>>>member.extent(newlist)
>>>member
['小甲鱼','黑夜','牡丹','怡静','醉酒','John_farmer']
3)insert()函数
上述两种方法,加入的元素自动被添加到列表的末尾,而insert()函数允许用户将加入的元素放置到任何位置,因此它需要两个参数第一个是新元素在列表中的位置,第二个为该元素,其调用形式为 列表.insert(位置,元素) 注意列表中第一个元素位置是从0开始的
member = ['小甲鱼','黑夜','牡丹','怡静'] 我们想将"醉酒"这个字符串元素放到列表member首位
>>>member.insert(0,'醉酒')
>>>member
['醉酒','小甲鱼','黑夜','牡丹','怡静']
三,通过索引值获得单个列表元素方法,删除列表中某一元素的方法及通过列表分片实现获取列表中多个元素的方法。
1. 通过索引值获得列表中元素
>>>member = ['小甲鱼','黑夜','牡丹','怡静']
>>>member[0]
'小甲鱼'
2. 从列表中删除元素的方法
1)remove()函数
参数是一个元素,调用该函数则删除该列表中的该元素,如果输入的元素不在列表中,则程序报错,例如
member = ['小甲鱼','黑夜','牡丹','怡静']
>>>member.remove('黑夜')
['小甲鱼','牡丹','怡静']
而此时如果再执行member.remove('黑夜'),由于该元素已经不存在此列表中,执行时将会报错
2)del语句
直接删除一个元素值,可以直接通过索引值获得需要删除的元素,例如:
>>>member = ['小甲鱼','黑夜','牡丹','怡静']
>>>del member[2]
>>>member
['小甲鱼','黑夜','怡静']
而执行语句del member,则member列表被删除,如果想再访问member则程序报错,因为它已经不存在了。
3)pop()函数
不需要参数,直接返回列表中最后一个元素并删除,例如:
>>>member = ['小甲鱼','黑夜','牡丹','怡静']
>>>name = member.pop()
>>>name
'怡静
>>>member
['小甲鱼','黑夜','牡丹']
3. 列表分片(slice)
当需要从列表一次性取出多个元素时,需要通过列表分片的方式来实现,其基本形式是列表名[左索引值:右索引值],左右索引值都可以省略,左索引值省略时表明,列表元素从0开始,右索引值省略表示包含左索引值右边的所有元素。例如:
>>>member = ['小甲鱼','黑夜','牡丹','怡静']
>>>split1 = member[1:3],则split1= ['黑夜','牡丹'] #member本身元素并没有发生变化,相当于生成了包含元素1和2的新列表
split2 = member[:3],则列表split2= ['小甲鱼','黑夜','牡丹'] #表示从第0个索引值开始
split3 = member[1:],则列表split3= ['黑夜','牡丹','怡静'] #表示从左索引值开始到列表右边所有元素
split4 = member[:],则列表split4= ['小甲鱼','黑夜','牡丹','怡静'] #相当于复制了一份原列表
四:列表中一些常用操作符和列表内的一些常用的内置函数使用
1. 列表中一些常用的操作符
1)比较操作符
列表是可以比较大小的,例如:
list1 = [123,456]
list2 = [456,123]
>>>list1>list2
False
在Python中会直接取两个数组的第0个元素进行比较,如果相等则继续对列表下一个元素进行比较,不相等则给出False或者True的值。这里面需要注意:元素的值必须符合比较运算符的适用范围,例如可以是两个数字进行对比,也可以是两个字符进行对比。
2)逻辑操作符
list1, list2, list3 = [123,456], [456,123], [123,456]
>>>(list1 < list2) and (list1 == list3) #先对两个列表进行比较,再进行逻辑与运算
True
3)连接操作符
在列表中连接操作符为+,例如:
list1, list2 = [123,456], [789]
list3 = list1 + list2
则list3=[123,456,789],+号起到了将两个列表中的元素连接起来的作用,这里需要注意的是,+号两边必须都是列表 "list3+345"是会报错的
4)重复操作符
以*进行列表中的元素重复操作,例如:
>>>list1 = [123,456]
>>>list1*3
[123,456,123,456,123,456]
5)成员关系操作符
in 和 not in 分别表示参数是否在列表中,
list1=[123,456]
>>>123 in list1
True,
>>>'小甲鱼' in list1
False,
>>>'小甲鱼' not in list1
True。
另外,in 和 not in只能访问属于列表同一层的元素,例如:
list1 = [123,456,['小甲鱼','醉酒'],789] 这是一个列表中含有列表元素的的列表。
>>> '醉酒' in list1
False #因为'醉酒'是在list1[2]这个元素列表中,
>>>'醉酒' in list1[2]
True
那么问题来了,如何访问元素'小甲鱼'和'醉酒'呢,这里是通过类似其他程序语言的二维数组形式实现的。例如list1[2][0]为'小甲鱼'。
2. 列表内的内置函数
首先通过dir(list)找出列表中有哪些内置函数:append clear copy count extend index insert pop remove reverse sort
1)clear() 函数
用于删除列表中的所有元素,形成一个空的列表,例如:
>>>list1 = [123,456,789]
list1.clear() 的值为[],一个空的列表
2)copy()函数
用于浅拷贝一个列表,例如:
list1 = [123,456]
list2 = list1.copy()
>>>list2
[123,456]
它的功能和列表分片功能 list2 = list1[:]作用是一样的;他们两个与赋值运算符=是有区别的,前者是在内存中重新申请一个空间并存放列表的值,而=则是将列表的地址直接赋值给了另一个列表
list1 = [1,3,5]
list2 =list1
list3 = list1.copy()
list1.append('醉酒')
>>>list1
[1,3,5,'醉酒']
>>>list3
[1,3,5]
3)count()函数
用于统计所需参数在列表中出现的次数,例如:
list1 = [1,3,1,4,1,5,1,10]
>>>list1.count(1)
4
>>>list1.count(100)
0
4)index()函数
用于寻找所输入参数在列表中的第一个位置并返回该位置值,还有两个参数可以确定寻找该值的的列表范围,例如:
list1 = [1,3,1,4,1,5,1,10]
>>>list1.index(1)
0
>>>list1.index(1,2,4)
2
>>>list1.index(100) 则报错,因为100不存在该列表中
5)reverse()函数
将列表中所有元素倒置,例如
list1 = [1,2,3,4,5]
>>>list1.reverse()
[5,4,3,2,1]
6)sort()函数&sorted()函数
这是一个比较重要的函数,其有三个参数值,前两个分别是指定排序算法和算法搭配的关键字,最后一个是reverse =False,说明默认状态下sort是按照从小到大进行排序,如果想改为从大到小则将reverse=True,例如
>>>list1 = [12,7,9,15,18,4]
>>>list1.sort()
[4,7,9,12,15,18]
>>>list1.sort(reverse=True) 从大到小排列
[18,15,12,9,7,4]
>>>sorted([5,2,3,1,4])
[1,2,3,4,5]
sort()与sorted()的不同在于,sort是在原位重新排列列表,而sorted()是产生一个新的列表。
元组,通过与列表进行对比来介绍元组独有的用法和特点,
1. 创建和访问元组,元组一旦建立,元组内的元素不允许修改和删除。
1.1 元组的创建:大多数时候,元组的标示是一个(),例如:
empty = () #定义了一个空元组
tuple1 = (1,7,4) #定义了一个纯数字的普通元组
tuple2 = (2,'小甲鱼','醉酒青牛',5) #定义了一个具有数字和字符串的混合元组
然而,当元组中仅有一个元素时,需要将元素后面加上逗号,例如:
tuple3 = (1,) #定义了一个只包含数字1的元组,1后面必须加上逗号才表示元组
甚至,不需要括号,仅仅有逗号就行,例如:
tuple4 = 1,
1.2 元组的访问:
元组的访问形式与列表一样都是:tuple[index],
例如:tuple4 = (1,5,9)
>>>tuple4[1]
5
tuple4[1] = 4 #将会报语法错误,不允许修改
和列表一样,可以对元组使用拼接操作符,重复操作符,逻辑操作符,关系操作符和成员操作符等。
2. 更新和删除元组
虽然元组本身不允许修改和删除,我们可以对原元组的元素进行修改并新生成一个新的元组存放这些修改后元素,例如:
tuple5 = ('小甲鱼','黑夜','小布丁') #定义一个纯字符串的元组
tuple5 = tuple5[:2] +("醉酒",)+ tuple5[2:] #通过元组分片形式和拼接操作,生成了在原元组的第一个位置上插入'醉酒青牛'元素的新元组
>>>tuple5
('小甲鱼','醉酒','黑夜','小布丁') #这样就实现了tuple5元组的更新,其实相当于重新生成了一个新的元组,并将其复制给了tuple5,原先的元组还存在,只是已经不再叫tuple5,它会被Python内存垃圾回收。
可以通过del语句直接删除一个元组,但是不允许利用del删除元组的一个元素,例如:
tuple6 = (1,3)
del tuple6
当然也可以采取变通的方法去掉元组的一个元素,例如:
tuple7 = ('小甲鱼','醉酒','黑夜','小布丁') #定义一个纯字符串的元组
tuple7 = tuple7[:1] + tuple7[2:] #通过元组分片形式和拼接操作,生成了去掉了'醉酒青牛'元素的新元组并赋值给tuple7
>>>tuple7
('小甲鱼','黑夜','小布丁') #原先的元组还存在,只是已经不再叫tuple7,它会被Python内存垃圾回收。
另外:Python中的函数是可以返回多个值的,其实是以元组的形式返回多个值
集合
一: 集合的概念和使用
在这里集合的概念和数学里集合的概念是一致的,都是一组元素的集,且元素之间不能重复。
1,Python中集合的定义和字典类似,都需要大括号,区别在于集合不需要映射
>>> dict1 = {}
>>> type(dict1)
<class 'dict'>
>>> set1 = {1,4,'小甲鱼'}
>>> type(set1)
<class 'set'>
2. set()函数
和序列工厂函数list(),str(),tuple()一样,可以将序列类型直接强制转换为一个集合类型
一个列表[1,2,3,4,5,5,3,1,0],如何去除列表内的重复元素,两种方法可供选择,第一种是常规方法,见下面所示:
>>> list2 = [1,2,3,4,5,5,3,1,0]
>>> list3 = []
>>> for each in list2:
if each not in list3:
list3.append(each)
>>> list3
[1, 2, 3, 4, 5, 0]
第二种方法使用集合的元素不重复性,通过将列表先强制转换为集合,再转换为列表形式实现
>>> list4 = [1,2,3,4,5,5,3,1,0]
>>> list4 = list(set(list4))
>>> list4
[0, 1, 2, 3, 4, 5]
3. 集合类型几个内置函数:
add()增加一个元素到集合内,remove()从集合内删除一个元素
>>> set2 = {1,2,3,4}
>>> set2.add(5)
>>> set2
{1, 2, 3, 4, 5}
>>> set2.remove(1)
>>> set2
{2, 3, 4, 5}
4. 将一个集合冻结使之无法添加和删除元素的函数frozenset()
>>> set3 = frozenset(set2)
>>> set3
frozenset({2, 3, 4, 5})
>>> set3.remove(2)
Traceback (most recent call last):
File "<pyshell#30>", line 1, in <module>
set3.remove(2)
AttributeError: 'frozenset' object has no attribute 'remove'
字典
1. 字典的创建和访问
字典不同于前述的序列类型,它是一种映射类型,它的引入就是为了简化定义索引值和元素值存在特定关系的定义和访问问题。字典的定义形式为:字典变量名 = {key1:value1,key2:value2....}。这里面key代表索引值,而value代表映射的值,通过大括号将其括起来进行字典的定义。访问字典时直接以字典变量名[key]进行访问,例如定义一个阿拉伯数字与相应英文的映射字典,举例说明:
>>> dict1 = {1:'one',2:'two',3:'three'}
>>> dict1[2]
'two'
2. dict()函数的用法
创建一个空字典,举例说明:
>>> dict3 = dict()
>>> dict3
{}
通过将key和value作为一个序列类型(元组或列表)创建一个字典
>>> dict4 = dict((('李宁','一切皆有可能'),('鱼C工作室','让编程改变世界')))
>>> dict4
{'李宁': '一切皆有可能', '鱼C工作室': '让编程改变世界'}
通过对关键字赋值创建一个字典,注意关键字必须是一个字符串类型且不能加引号,因为程序会默认为其加上一个引号,举例说明:
>>> dict5 = dict(李宁='一切皆有可能', 鱼C工作室='让编程改变世界')
>>> dict5
{'李宁': '一切皆有可能', '鱼C工作室': '让编程改变世界'}
3. 修改或添加字典元素
通过将变量赋值给字典访问类修改或者增加字典的元素、
>>> dict6 = {'李宁': '一切皆有可能', '鱼C工作室': '让编程改变世界'}
>>> dict6['李宁'] = '打造民族品牌'
当key值存在于字典内时,则重置key的value值
>>> dict6
{'李宁': '打造民族品牌', '鱼C工作室': '让编程改变世界'}
>>> dict6['小甲鱼']='让更多的人学会编程'
当key值不存在于字典内时,则字典增加一个相(key:value)
>>> dict6
{'小甲鱼': '让更多的人学会编程', '李宁': '打造民族品牌', '鱼C工作室': '让编程改变世界'}
常用的内置函数
主要涉及到创建一个新的字典并返回该对象的fromkeys(),访问字典函数函数keyes(),values(),items(),成员操作符in not in,清除一个字典内容的clear()和复制一个新的字典的copy(),自动去除一个字典item的pop()和popitem(),以及最后更新字典的setdefault()和update()。
1. 工厂函数的概念
和序列类型的工厂函数一样,dict()也是一个工厂函数2. 字典类型内置函数的用法
2.1 fromkeys(iterable, value=None, /) 创建并返回一个新的字典。其中第一个参数是一个可迭代对象(序列类型),第二个参数是value值,当第二个参数不提供时,则默认为none,举例说明:
>>> dict1 = dict()
>>> dict2 = dict1.fromkeys((1, 2, 3), 'number')
>>> dict2
{1: 'number', 2: 'number', 3: 'number'}
>>> dict1
{}
>>> dict3 = dict1.fromkeys((1, 2, 3))
>>> dict3
{1: None, 2: None, 3: None}
2.2 访问字典的内置函数,这里主要是访问字典的key的keys(),访问字典的value的values(),访问item的items()。当然也可以直接用get()通过key访问其对应的value。
>>> dict4 = dict1.fromkeys((1,2,3),'赞')
>>> dict4
{1: '赞', 2: '赞', 3: '赞'}
>>> dict4.keys()
dict_keys([1, 2, 3])
>>> for eachkey in dict4.keys():
print(eachkey)
1
2
3
>>> for eachvalue in dict4.values():
print(eachvalue)
赞
赞
赞
>>> for eachitem in dict4.items():
print(eachitem)
(1, '赞')
(2, '赞')
(3, '赞')
get(k[,d])通过key返回对应的value值,第一个参数为key值,第二个参数为默认返回的value值,当key存在则返回对应的value,不存在字典内时返回该值,如果不提供则默认为none,举例说明
>>> dict5 = {1:'one',2:'two',3:'three'}
>>> dict5.get(3,'木有')
'three'
>>> dict5.get(4,'木有')
'木有'
>>> dict5.get(4)
>>> print(dict5.get(4))
None
2.3 清空字典和复制一个字典函数clear()和copy()。这里面主要要搞清楚copy()和=赋值的区别,copy()相当于复制出一个新的字典,两者互不影响,而赋值=仅是将字典内存地址赋值出去,两者共同指向一个地址,
>>> dict6 = dict5
>>> dict7 = dict5.copy()
>>> id(dict6)
58796168
>>> id(dict5)
58796168
>>> id(dict7)
58795208
>>> dict5
{1: 'one', 2: 'two', 3: 'three'}
>>> dict6.clear()
>>>dict6
{}
>>> dict5
{}
>>> dict7
{1: 'one', 2: 'two', 3: 'three'}
2.4 去除字典一个元素内置函数。pop(k[,d]),当k存在字典的key时,在字典内去除该key对应的(key,value),否则返回d的值,当d不提供时返回错误,举例说明:
>>> dict7
{1: 'one', 2: 'two', 3: 'three'}
>>> dict7.pop(1,'木有')
'one'
>>> dict7
{2: 'two', 3: 'three'}
>>> dict7.pop(1,'木有')
'木有'
>>> dict7.pop(1)
Traceback (most recent call last):
File "<pyshell#46>", line 1, in <module>
dict7.pop(1)
KeyError: 1
popitem()去除字典内的一个(key,value),如果字典本身为空时报错
>>> dict7
{2: 'two', 3: 'three'}
>>> dict7.popitem()
(2, 'two')
>>> dict7
{3: 'three'}
2.5 给字典增加一个item,setdefault(k[,d]),返回k对应的value值,当k不在字典内时则返回d的值,如果d没提供则返回空;同时如果k不存在字典内时,将d作为value映射给k
>>> dict7
{3: 'three'}
>>> dict7.setdefault(1,'one')
'one'
>>> dict7
{1: 'one', 3: 'three'}
>>> dict7.setdefault(2)
>>> dict7
{1: 'one', 2: None, 3: 'three'}
>>> dict7.setdefault(3,'有')
'three'
D.update([E, ]**F) 将一个字典内的item作为item添加到字典内
>>> dict7
{1: 'one', 2: None, 3: 'three', 4: 'two'}
>>> dict7.pop(4)
'two'
>>> dict7
{1: 'one', 2: None, 3: 'three'}
>>> dict8 = {4:'four'}
>>> dict7.update(dict8)
>>> dict7
{1: 'one', 2: None, 3: 'three', 4: 'four'}
>>> dict9 = {2:'two'}
>>> dict7.update(dict9)
>>>dict7
{1: 'one', 2: 'two', 3: 'three', 4: 'four'}
相关推荐
- PYTHON-简易计算器的元素介绍
-
[烟花]了解模板代码的组成importPySimpleGUIassg#1)导入库layout=[[],[],[]]#2)定义布局,确定行数window=sg.Window(...
- 如何使用Python编写一个简单的计算器程序
-
Python是一种简单易学的编程语言,非常适合初学者入门。本文将教您如何使用Python编写一个简单易用的计算器程序,帮助您快速进行基本的数学运算。无需任何高深的数学知识,只需跟随本文的步骤,即可轻松...
- 用Python打造一个简洁美观的桌面计算器
-
最近在学习PythonGUI编程,顺手用Tkinter实现了一个简易桌面计算器,功能虽然不复杂,但非常适合新手练手。如果你正在学习Python,不妨一起来看看这个项目吧!项目背景Tkint...
- 用Python制作一个带图形界面的计算器
-
大家好,今天我要带大家使用Python制作一个具有图形界面的计算器应用程序。这个项目不仅可以帮助你巩固Python编程基础,还可以让你初步体验图形化编程的乐趣。我们将使用Python的tkinter库...
- 用python怎么做最简单的桌面计算器
-
有网友问,用python怎么做一个最简单的桌面计算器。如果只强调简单,在本机运行,不考虑安全性和容错等的话,你能想到的最简单的方案是什么呢?我觉得用tkinter加eval就够简单的。现在开整。首先创...
- 说好的《Think Python 2e》更新呢!
-
编程派微信号:codingpy本周三脱更了,不过发现好多朋友在那天去访问《ThinkPython2e》的在线版,感觉有点对不住呢(实在是没抽出时间来更新)。不过还好本周六的更新可以实现,要不就放一...
- 构建AI系统(三):使用Python设置您的第一个MCP服务器
-
是时候动手实践了!在这一部分中,我们将设置开发环境并创建我们的第一个MCP服务器。如果您从未编写过代码,也不用担心-我们将一步一步来。我们要构建什么还记得第1部分中Maria的咖啡馆吗?我们正在创...
- 函数还是类?90%程序员都踩过的Python认知误区
-
那个深夜,你在调试代码,一行行检查变量类型。突然,一个TypeError错误蹦出来,你盯着那句"strobjectisnotcallable",咖啡杯在桌上留下了一圈深色...
- 《Think Python 2e》中译版更新啦!
-
【回复“python”,送你十本电子书】又到了周三,一周快过去一半了。小编按计划更新《ThinkPython2e》最新版中译。今天更新的是第五章:条件和递归。具体内容请点击阅读原文查看。其他章节的...
- Python mysql批量更新数据(兼容动态数据库字段、表名)
-
一、应用场景上篇文章我们学会了在pymysql事务中批量插入数据的复用代码,既然有了批量插入,那批量更新和批量删除的操作也少不了。二、解决思路为了解决批量删除和批量更新的问题,提出如下思路:所有更新语...
- Python Pandas 库:解锁 combine、update 和compare函数的强大功能
-
在Python的数据处理领域,Pandas库提供了丰富且实用的函数,帮助我们高效地处理和分析数据。今天,咱们就来深入探索Pandas库中四个功能独特的函数:combine、combine_fi...
- 记录Python3.7.4更新到Python.3.7.8
-
Python官网Python安装包下载下载文件名称运行后选择升级选项等待安装安装完毕打开IDLE使用Python...
- Python千叶网原图爬虫:界面化升级实践
-
该工具以Python爬虫技术为核心,实现千叶网原图的精准抓取,突破缩略图限制,直达高清资源。新增图形化界面(GUI)后,操作门槛大幅降低:-界面集成URL输入、存储路径选择、线程设置等核心功能,...
- __future__模块:Python语言版本演进的桥梁
-
摘要Python作为一门持续演进的编程语言,在版本迭代过程中不可避免地引入了破坏性变更。__future__模块作为Python兼容性管理的核心机制,为开发者提供了在旧版本中体验新特性的能力。本文深入...
- Python 集合隐藏技能:add 与 update 的致命区别,90% 开发者都踩过坑
-
add函数的使用场景及错误注意添加单一元素:正确示例:pythons={1,2}s.add(3)print(s)#{1,2,3}错误场景:试图添加可变对象(如列表)会报错(Pytho...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python读取文件夹下所有文件 (59)
- java调用python脚本 (56)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)