Python学习入门(四)组合数据类型

Python学习入门

四、组合数据类型

下⾯介绍着数据类型:列表list,元组tuple,字典dict,集合set。
根据官⽅⽂档的数据,Python没有数组类型。在后⾯会学习到的NumPy中有⼀个类型是ndarray(n维
数组)
上⾯组合类型⼜可以分为三⼤类型:
1、序列
不可变序列:tuple(元组),str(字符串);
可变序列:list(列表)。
2、集合set
集合对象是⼀个由互不相同的hashable对象组成的⽆序集合。
set可变,frozenset不可变。
3、字典dict
str的运算符,函数,list和tuple都具备。

4.1 列表

列表(list)⽬的是存储或操作⼀组数据的集合。
当我有⼀百个数据要进⾏储存的时候,我可以选择⽤100个变量分别进⾏储存、但显然这不是⼀个更好的⽅案。我们可以⽤⼀个集合形式的数据结构,把这⼀百个数据储存到⼀块,需要的时候再分别进⾏提取。
这就是列表、集合等数据类型存在的意义。
我们可以把它想象成⼀个⼤桶,当我们有⼀堆东⻄需要找个地⽅临时存放在⼀起,以便后续进⾏排序、筛选等操作时,就可以弄⼀个列表,把这些东⻄放进去。

4.1.1 函数list

我们可以将任何序列(⽽不仅仅是字符串)作为list的参数。

list('Hello')
d = {'a':1, 'b':2}
list(d)

如果要将字符列表(如上述代码中的字符列表)转换为字符串,可使⽤下⾯的表达式:

''.join(somelist)
4.1.2 列表的定义⽅法
  1. 列表是⼀种可变的数据类型
  2. 列表中的数据类型不限
  3. 列表中的多个值之间⽤逗号进⾏分割
# 列表中的内容可以是任意的数据类型
list1 = [1234,'Hello',3.14,True,'abc']
list2 = [33434,
'你好', 4545.565555,
'iii',
True]
list3 = [1, 2, 3, 'Hello', [1, 2, 3, 4, 5] ]   # ⼆维列表
list4 = [1, 2, 3, 'Hello', [1, 2, [1, [1, 2, 3], 3], 4, 5] ]   # ⼆维列表
4.1.3 列表的索引和切⽚

列表:有序的序列,所以每⼀个数据都有唯⼀对应的索引值。
1、语法:列表[start:stop:step]
2、列表[起始位置:终⽌位置:步⻓和⽅向],开始的位置包含在内,⽽终⽌的位置不包含在内
3、步⻓的默认值为1,当步⻓设置为正整数,代表⽅向从左往右,当步⻓设置为负整数,代表从后往前进⾏切⽚
4、起始位置和终⽌位置,如果不填,代表从头到尾所有数据

4.1.4 ⼆维列表的索引⽅法
list5 = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
# 索引出1
list5[0][0]
# 索引出[7,8,9]
list5[-1]
# 反转
list5[::-1]
4.1.5 更改列表中的值
list5 = ['零', '⼀', '⼆', '三', '四', '五', '六']
# 将“⼀”改为“壹”
list5[1] = "壹"
# 将(⼆,三,四)改为(2,3,4)
list5[2:5] = 2,3,4
4.1.6 列表的常⽤⽅法

在这里插入图片描述

4.1.7 列表的拼接和重复
4.1.7.1 序列相加

可使⽤加法运算符来拼接序列。

[1,2,3]+[4,5,6] # [1,2,3,4,5,6]
'Hello,'+ 'world!' # 'Hello,world!'
[1,2,3]+'world!'
# TypeError: can only concatenate list (not "str") to list

从错误消息可知,不能拼接列表和字符串,虽然它们都是序列。⼀般⽽⾔,不能拼接不同类型的序列。

4.1.7.2 乘法

将序列与数n相乘时,将重复这个序列n次来创建⼀个新序列:

a = ['a','b','c'] a * 3
# ['a','b','c','a','b','c','a','b','c']
4.1.8 成员资格

检查特定值是否包含在序列中,我们可使⽤运算符in。它检查是否满⾜指定的条件,并返回相应的值:
满⾜时返回True,不满⾜时返回False。

x = 'abcd'
'a' in a # True
'e' in a # False

users = ['Evan','John','Sherry']
input('Enter your user name:') in users
# Enter your user name: Evan
# True
4.1.9 列表的浅复制和深复制

⽅法copy复制列表,常规复制只是将另⼀个名称关联到列表。

a = [1,2,3]
b = a 
b[1] = 4 
a
# [1,4,3]

要让a和b指向不同的列表,就必须将b关联到a的副本。

a = [1,2,3] 
b = a.copy()
b[1] = 4 
a
# [1,2,3]

这类似于使⽤a[:]或list(a),它们也都复制a。

a = [1,2,3] 
b =a[:]
b
# [1,2,3]
4.1.10 删除元素

从列表中删除元素也很容易,只需要⽤del语句即可。
del 序列:从内存中删除:del list1。
但是,del list1[:]是删除数据。

4.1.11 列表的清空

⽅法clear就地清空列表的内容。

lst = [1,2,3]
lst.clear()
lst
# []

这类似于切⽚赋值语句lst[:] = []

【难点】4.1.12 列表推导式
[<表达式> for x1 in <序列1> [...for xN in <序列N> if <条件表达式>]]

列表推导式即List Comprehensions,是Python内置的⾮常简单却强⼤的可以⽤来创建list的⽣成式。

4.1.12.1 ⼀个简单的例⼦

如果我们想要⽣成⼀个由2, 4, 6…20的数字组成的列表,都有什么办法呢

a = [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
list(range(2, 22, 2))
L = []
for i in range(1,11):
 L.append(i*2)

另⼀种优雅的实现⽅式就是使⽤列表推导式(List Comprehensions):

[i*2 for i in range(1,11)]
4.1.12.2 基本语法

我们具体来分析上⾯给出的例⼦:
我们将列表推导式写在⼀个⽅括号内,因为它最终构建的是⼀个列表。
列表推导式主要由两部分构成:
1.循环变量表达式( i * 2 )
2.for 循环头部( for i in L )
是不是⾮常简单!

4.1.12.3 ⼯作原理

Python在执⾏列表推导式时,会对可迭代对象 L 进⾏迭代,将每⼀次迭代的值赋给循环变量 x ,然后收集变量表达式 i * 2 的计算结果,最终由这些结果构成了新的列表,也就是列表推导式所返回的值。

4.1.12.4 ⾼级语法

带有 if 语句
我们可以在 for 语句后⾯跟上⼀个 if 判断语句,⽤于过滤掉那些不满⾜条件的结果项。
实例:

square = [x**2 for x in range(10) if x!=5]

上⾯可以这么理解:先创建空列表,然后是for循环,⾥⾯做⼀个if判断,最后再把空列表做累加,也就是:

square = []
for x in range(10):
 if x!=5:
 lst.append(x**2) 

带有for嵌套
在复杂⼀点的列表推导式中,可以嵌套有多个 for 语句。按照从左⾄右的顺序,分别是外层循环到内层循环。

[x + y for x in 'ab' for y in 'jk']

更复杂的列表表达式:
既有if语句⼜有for嵌套:

[[x,y] for x in [1,2,3] for y in [3,1,4] if x!=y]

再例如,下⾯的代码输出了0~4之间的偶数和奇数的组合。每⼀个 for 循环后⾯都有可选的 if 语
句。

[(x, y) for x in range(5) if x % 2 == 0 for y in range(5) if y % 2 == 1]

等价于下⾯的⼀般 for 循环:


L = []
for x in range(5):
 if x % 2 == 0:
 for y in range(5):
 if y % 2 == 1:
 L.append((x,y))
L 

4.2 元组

Python的元组与列表类似,元组也是序列,唯⼀的差别在于元组是不能修改的。

4.2.1 元组的语法

在这里插入图片描述

4.2.2 函数tuple

函数tuple的⼯作原理与list很像:它将⼀个序列作为参数,并将其转换为元组。如果参数已经是元组,那么就原封不动地返回它。

tuple([1,2,3])
# (1,2,3)
【重点】4.2.3 元组不可变的含义
tp2 = ('a', 'b', ['A', 'B'])
tp2[2][0] = 'X'
tp2[2][1] = 'Y'
tp2
# ('a','b',['X','Y'])

在这里插入图片描述在这里插入图片描述

表⾯上看,tuple的元素确实变了,但其实变得不是tuple的元素⽽是list的元素。tuple⼀开始指向的list 并没有改成别的list,所以tuple所谓的 ”不变“ 是指,tuple的每个元素,指向永远不变。即指向’a’,就不能改成指向‘b’,指向⼀个list,就不能改成指向其他对象,但指向的这个list本身是可变的!

4.2.4 元组的拼接和重复

同其他序列⼀样,元组的拼接⽤+号连接,元组的重复仍使⽤*n的⽅式。

4.2.5 元组的⽅法

元组的创建⽅式及其元素的访问⽅式与其他序列是相同的,但在元组中,增删改是不被允许的。

4.2.6 元组与列表区别
  1. 元组和列表很类似,它们经常被⽤来在不同的情况和不同的⽤途。
  2. 元组有很多⽤途。例如(x,y)坐标对,数据库中的员⼯记录等等。
  3. 元组就像是字符串,是不可变的。通常包含不同种类的元素并通过分拆或索引访问。
  4. 列表内容是可变的,它们的元素通常是相同类型的,并通过迭代访问。

对于某些领域来说,能⽤元组,就不⽤列表,因为;
元组速度更快,它是敞亮的。
使⽤元组不需要对修改的数据进⾏写保护,使得数据更安全。

4.3 集合

集合是⼀个⽆序不重复元素的集。
基本功能包括关系测试和消除重复元素。
集合对象还⽀持union(联合),intersection(交),difffference(差)和sysmmetric
difffference(对称差集)等数学运算

4.3.1 创建

在这里插入图片描述

set5 = set(())
set6 = set([])
set7 = set({})
set8 = {} # 这是字典创建的⽅式

Tips:如果创建不可修改集合⽤frozenset

4.3.2 基本操作

在这里插入图片描述

4.3.2.2 移除元素
语法:

set.remove(x) 

实例:
将元素x从集合s中移除,如果元素不存在,则会发⽣错误:

s = set(('Google','Facebook','Alibaba','Amazon'))
s.remove('Amazon')
print(s) 
s.remove('Baidu')

此外还有⼀个⽅法也是移除集合中的元素,且如果元素不存在,不会发⽣错误。格式如下所示:

set.discard(x)

在这里插入图片描述

4.3.2.3 计算集合元素个数
在这里插入图片描述

4.3.2.5 判断元素是否存在于集合中
在这里插入图片描述

4.3.3 数学运算符所对应的集合内置⽅法

在这里插入图片描述

4.3.3.1 set.intersection()
intersection() ⽅法⽤于返回两个或更多集合中都包含的元素,即交集。
语法:

set.intersection(set1,set2,...)

参数:
set1:必需,代表要查找相同元素的集合。
set2:可选,代表其他要查找相同元素的集合。这⾥可以是多个,但需要使⽤逗号隔开。
返回值:
返回⼀个新的集合。
实例:
返回⼀个新集合,该集合的元素既包含在集合x中,⼜包含在集合y中:

x = {'apple','banana','lemon'} 
y = {'Google','Facebook','apple'} 
z = x.intersection(y)
print(z)

计算多个集合的并集:

x = {'a','b','c'} 
y = {'c','d','e'} 
z = {'f','g','c'}
result = x.intersection(y,z)
print(result)

4.3.3.2 set.union()
union() ⽅法返回两个集合的并集,即包含了所有集合的元素,重复的元素只会出现⼀次。
在这里插入图片描述

4.3.3.3 set.difffference()
difffference() ⽅法⽤于返回集合的差集,即返回的集合元素包含在第⼀个集合中,但不包含在第⼆个集
合(⽅法的参数)中。
在这里插入图片描述

参数:
set:集合
返回值:
返回⼀个新的集合。
实例:
返回两个集合组成的新集合,但会移除两个集合的重复元素:

x = {'apple','banana','lemon'} 
y = {'Google','Facebook','apple'} 
z = x.symmetric_difference(y)
print(z)

4.3.3.5 set.issubset()
issubset() ⽅法⽤于判断集合的所有元素是否都包含在指定集合中,如果是则返回True,否则返回False。
在这里插入图片描述

4.3.3.6 set.issuperset()

issuperset() ⽅法⽤于判断指定集合的所有元素是否都包含在原始的集合中,如果是则返回True,否则返回False。
在这里插入图片描述

4.3.3.7 set.update()
update() ⽅法⽤于修改当前集合,可以添加新的元素或集合到当前集合中,如果添加的元素在集合中已存在,则该元素只会出现⼀次,重复的会忽略。
语法:

set.update(set)

参数:
set:必需,可以是元素或集合。
返回值:

实例:
合并两个集合,重复元素只会出现⼀次:

x = {'apple','banana','lemon'} 
y = {'Google','Facebook','apple'} 
x.update(y)
print(x)
4.3.4 其他内置⽅法
4.3.4.1 set.isdisjoint()

isdisjoint() ⽅法⽤于判断两个集合是否包含相同的元素,如果没有返回True,否则返回Fasle。
在这里插入图片描述

x = {'apple','banana','lemon'}
y = {'Google','Facebook','apple'} 
z = x.isdisjoint(y)
print(z)
4.3.4.2 set.symmetric_difffference_update()

symmetric_difffference_update() ⽅法移除当前集合中在另外⼀个指定集合相同的元素,并将另外⼀个
指定集合中不同的元素插⼊到当前集合中。
在这里插入图片描述

4.3.5 集合推导式

类似列表推导式,这⾥有⼀种集合推导式语法:

a = {x for x in 'abracadabra' if x not in 'abc'}

4.4 字典

字典是另⼀种可变容器模型,且可存储任意类型的对象。
字典是包含⼀个索引的集合,称为键和值的集合。
4.4.1 创建
⽅法⼀:
字典的每个键值(key→value)对⽤冒号分割,每个对之间⽤逗号分割,整个字典包括在花括号{}中:

d = {key1:value1,key2:value2}

其中键必须是唯⼀的,但值则不必。
值可以取任何数据类型,但键必须是不可变的,如字符串、数字和元组:

d = {'a':'1111','b':'2222','c':'3333'}

⽅法⼆:
将键/值对看成⼀个元素,格式为:

d = dict([(k1,v1),(k2,v2),(k3,v3)])

实例:

d = dict([('a','1111'),('b','2222'),('c','3333')])

⽅法三:
这种⽅法,键只能为字符串类型,并且不能加引号,格式为:

d = dict(k1=v1,k2=v2)

实例:

d = dict(a=1,b=2)
4.4.2 访问字典⾥的值

将相应的键放⼊到⽅括号中,如下所示:

d = {'Name':'Evan','Age':20,'Class':'First'}
print('Name:',d['Name'])
print('Age:',d['Age'])

如果⽤字典⾥没有的键访问数据,会输出错误如下:

d = {'Name':'Evan','Age':20,'Class':'First'}
print('Name:',d['Sherry'])
 
# KeyError: 'Sherry'
4.4.3 修改字典

向字典添加新内容的⽅法是增加新的键/值对,修改或删除已有键/值对如下实例:

d = {'Name':'Evan','Age':20,'Class':'First'} d['Age'] = 22 # 更新Age
d['School'] = 'CDA数据分析研究院' # 添加信息
print('Age:',d['Age'])
print('School:',d['School'])
4.4.4 删除字典元素

字典能删除单⼀的元素也能清空,删除⼀个字典⽤del命令,如下所示:

d = {'Name':'Evan','Age':20,'Class':'First'}
del d['Name'] # 删除键'Name'
d.clear() # 清空字典
del d # 删除字典
print('Age:',d['Age'])

执⾏del命令后,定义的字典就不存在于内存中了。

4.4.5 字典键的特性

我们知道字典的值可以任何的Python对象,但键不⾏。

在这里插入图片描述

4.4.6 字典内置函数/⽅法
4.4.6.1 len(dict)

计算字典元素个数,即键的总数。

d = {'Name':'Evan','Age':20,'Class':'First'}
len(d)
4.4.6.2 str(dict)

输出字典,以可打印的字符串表示。

d = {'Name':'Evan','Age':20,'Class':'First'}
str(d) 

在这里插入图片描述
在这里插入图片描述

字典d1相⽐字典d,有两个重复的元素、⼀个key相同但值不同的元素,以及⼀个新元素,据此测试更新函数的更新效果。
Point:

  1. 更新原则是有新的部分则更换或添加新的部分,其他部分保留;
  2. 更新是有⽅向的,d.update(d1)和d1.update(d)有本质的区别:
  3. 更新过程会在原来对象基础上对其进⾏修改。
4.4.6.8 dict.setdefault⽅法

setdefault⽅法会根据键值对原本是否存在进⾏有选择性的修改。
setdefault⽅法使⽤过程中,第⼀个参数位输⼊备选key,第⼆个参数位置输⼊备选value:

  1. 若该备选key在原字典中存在,则返回该key对应的value,第⼆个参数位输⼊的value⽆任何作⽤,且原字典不会被修改;
  2. 若该备选key在原字典中存在,则返回该key对应的备选value,备选key-value将被添加⾄字典中,原字典将会被修改
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值