python 数据类型----可变数据类型

一、list列表类型:

一种有序集合,里面有多个数据用逗号隔开,可以对数据进行追加、插入、删除和替换;使用**[]**标识,可以包含任意数据类型
登录后复制

plain 复制代码
# 字符串类型列表
names=['bill','may','jack']

#整数型列表
numbers = [1,2,34,4]

#混合类型列表
values=['Bill',23,23.45,True]

列表的基本操作

创建列表
  • 方法1:list(iterable)函数

使用list(iterable)函数:可迭代对象(字符串、列表、元组、集合和字典等)

  • 方法2:[元素1,元素2,......]
通过索引操作列表元素

登录后复制

plain 复制代码
names = ["Bill", "Mary", "Jack"]
print(names[0])			# 运行结果:Bill
print(names[2])			# 运行结果:Jack

s = "Hello World"
print(s[0])				# 运行结果:H
print(s[3])				# 运行结果:l
print("Apple"[2])			# 运行结果:p
列表封包和列表解包

解包时,变量的数量必须与列表中的元素的个数相同,否则会抛出异常

可以使用通配符(*)部分元素解包
登录后复制

plain 复制代码
values=10,20,30
#运行结果 <class 'tuple'>
print(type(values))

x,y,z=values
#运行结果10 20 30
print(x,y,z)
#部分解包
a,b,*c =[1,2,3,4,5,6,6,7]
#运行结果 1 2 [3, 4, 5, 6, 6, 7]
print(a,b,c)
追加元素

列表是可变的序列对象,可以追加元素

  • 单个元素追加append(x)
  • 多个元素追加:(+)运算符或者列表的extend(t)方法
插入元素

list.insert(i,x)方法,i指定索引位置,x是要插入的元素

替换元素

直接赋值符号(=)

删除元素
  • list.remove(x)

找到匹配的元素x,则删除该元素,如果多个匹配元素,只删除第一个匹配的元素

  • pop方法

登录后复制

plain 复制代码
a = [1,2,3,4]
a.pop(1)
print(a)
#>>>[1, 3, 4]
  • del方法

登录后复制

plain 复制代码
a = [1,2,3,4,'张三']
del a[4]
print(a)
# >>>[1, 2, 3, 4]
list内元素翻转
  • x.reverse()

登录后复制

plain 复制代码
b = ['李四', '张三', '王二', '赵一' ]
b.reverse()
print(b)
#>>>['赵一', '王二', '张三', '李四']
list内的元素排序

x.sort()升序排序;x.sort(reverse=True)降序排序
登录后复制

plain 复制代码
a = [4,2,1,3]
a.sort()
print(a)
#>>>[1, 2, 3, 4]
a.sort(reverse=True)
print(a)
#>>>[4, 3, 2, 1]
list的切片

列表的切片:分割一个列表,只提取其中某一个片段出来

  • list[start: end: step]
  • start: 从哪里开始,
  • end: 到哪里结束,
  • step: 步长,每几个元素获取一次值 -- 默认为1,可以省略;左闭右开(取头不取尾)

登录后复制

plain 复制代码
lst3 = [100, 3.14, True, "python", [1, 2, 3, 4]]
print(lst3[0])

#切片:
print(lst3[0:2])
#>>>>>>>> [100, 3.14]
print(lst3[0:4])
#>>>>>>>> [100, 3.14, True, 'python']
print(lst3[2:4])
#>>>>>>>> [True, 'python']
print(lst3[0:])
#>>>>>>>> [100, 3.14, True, "python", [1, 2, 3, 4]] end可以省略,默认取到最后
print(lst3[:4]) 
#>>>>>>>> [100, 3.14, True, 'python'] start可以省略,默认从0开始
print(lst3[0::2])
#>>>>>>>> [100, True, [1, 2, 3, 4]] 从0开始,步长为2
list的元素统计

统计元素的个数:count() -- 判断这个元素在列表中有几个
登录后复制

plain 复制代码
lst3 = [100, 3.14, True, "python", [1, 2, 3, 4, "python", "python"]]
print(lst3.count("python"))
#>>>>>>>>> 1 count将列表内元素作为参数,返回列表内该元素出现的次数
print(lst3[4].count("python"))
#>>>>>>>>> 2
常见方法
  • append:在列表最后插入新的值
  • clear:清除列表内容
  • copy:复制列表
  • count:统计某个元素在列表中出现的次数
  • extend:在列表结尾插入另一个列表,用新列表扩展原有的列表。列表相加产生一个新列表,extend改变被扩展的列表
  • index:从列表中找出某个值第一次出现的索引位置
  • insert:将值插入列表的指定位置
  • pop:移除列表中的元素,默认是最后一个元素,并返回该元素的值
  • remove:移除列表中某个值的第一次匹配项
  • reverse:将列表中的元素反向存放
  • sort:对列表进行排序,改变原来的列表

登录后复制

plain 复制代码
print("----测试append方法-----")
numbers = [1, 2, 3, 4]
numbers.append(5)  # 将5添加到numbers列表的最后
print(numbers)  # 运行结果:[1, 2, 3, 4, 5]
numbers.append([6, 7])  # 将列表[6,7]作为一个值添加到numbers列表后面
print(numbers)  # [1, 2, 3, 4, 5, [6, 7]]

print("----测试clear方法-----")
names = ["Bill", "Mary", "Jack"]
print(names)
names.clear();  # 清空names列表
print(names)  # 运行结果:[]

print("----测试copy方法-----")
a = [1, 2, 3]
b = a  # a和b指向了同一个列表
b[1] = 30  # 修改列表b的元素值,a列表中对应的元素值也会改变
print(a)  # 运行结果:[1, 30, 3]

aa = [1, 2, 3]
bb = aa.copy()  # bb是aa的副本
bb[1] = 30  # 修改bb中的元素值,aa中的元素值不会有任何变化
print(aa)  # 运行结果:[1, 2, 3]

print("----测试count方法-----")
search = ["he", "new", "he", "he", "world", "peter", [1, 2, 3], "ok", [1, 2, 3]]
#  搜索"he"在search出现的次数,运行结果:3
print(search.count("he"))
#  搜索[1,2,3]在search出现的次数,运行结果:2
print(search.count([1, 2, 3]))

print("----测试extend方法-----")
a = [1, 2, 3]
b = [4, 5, 6]
a.extend(b)  # 将b列表接在a列表的后面,extend方法并不返回值
print(a)  # 运行结果:[1, 2, 3, 4, 5, 6]

# 如果使用列表连接操作,效率会更低,并不建议使用
a = [1, 2, 3]
b = [4, 5, 6]
print(a + b)  # 运行结果:[1, 2, 3, 4, 5, 6]

# 可以使用分片赋值的方法实现同样的效果
a = [1, 2, 3]
b = [4, 5, 6]
a[len(a):] = b
print(a)  # 运行结果:[1, 2, 3, 4, 5, 6]

print("----测试index方法-----")
s = ["I", "love", "python"];
print(s.index("python"))  # 查询"python"的索引位置,运行结果:2
print("xyz在列表中不存在,所以搜索是会抛出异常.")
# str.index("xyz")   			# 会抛出异常,因为"xyz"在s列表中不存在

print("----测试insert方法-----")
numbers = [1, 2, 3, 4, 5]
numbers.insert(3, "four")  # 在numbers列表的第4个元素的位置插入一个"four"
print(numbers)  # 运行结果:[1, 2, 3, 'four', 4, 5]
#  可以使用分片赋值实现同样的效果
numbers = [1, 2, 3, 4, 5]
numbers[3:3] = ['four']  # 使用分片赋值在列表中插入另一个列表
print(numbers)  # 运行结果:[1, 2, 3, 'four', 4, 5]

print("----测试pop方法-----")
numbers = [1, 2, 3]
#  pop方法返回删除的元素值
print(numbers.pop())  # 删除numbers列表中的最后一个元素值,运行结果:3
print(numbers.pop(0))  # 删除numbers列表中的第1个元素值,运行结果:1
print(numbers)  # 运行结果:[2]

print("----测试remove方法-----")
words = ["he", "new", "he", "yes", "bike"]
words.remove("he")  # 删除words列表中的第1个"he"
print(words)  # 运行结果:['new', 'he', 'yes', 'bike']
# words.remove("ok")    			#  删除不存在的列表元素,会抛出异常

print("----测试reverse方法-----")
numbers = [1, 2, 3, 4, 5, 6]
numbers.reverse()  # 将numbers列表中的元素值倒序摆放
print(numbers)  # 运行结果:[6, 5, 4, 3, 2, 1]

print("----测试sort方法-----")
numbers = [5, 4, 1, 7, 4, 2]
numbers.sort()  # 对numbers列表中的元素值按升序排序(默认)
print(numbers)  # 运行结果:[1, 2, 4, 4, 5, 7]

values = [6, 5, 2, 7, "aa", "bb", "cc"]
# 待排序列表的元素类型必须是可比较的,字符串和数值类型不能直接比较,否则会抛出异常
# values.sort()  					#  抛出异常

# 使用sort方法排序,会直接修改原列表,如果要想对列表的副本进行排序,可以使用下面的代码
# 方法1:使用分片操作
x = [5, 4, 1, 8, 6]
y = x[:]
y.sort();  # 对列表的副本进行排序
print(x)  # 运行结果:[5, 4, 1, 8, 6]
print(y)  # 运行结果:[1, 4, 5, 6, 8]

# 方法2:使用sorted函数
x = [7, 6, 4, 8, 5]
y = sorted(x)  # 对x的副本进行排序
print(x)  # 运行结果:[7, 6, 4, 8, 5]
print(y)  # 运行结果:[4, 5, 6, 7, 8]

# sorted函数可以对任何序列进行排序,例如对字符串进行排序
print(sorted("geekori"))  # 运行结果:['e', 'e', 'g', 'i', 'k', 'o', 'r']

x = [5, 4, 1, 7, 5]
x.sort(reverse=True)  # 对列表x中的元素值降序排列
print(x)  # 运行结果:[7, 5, 5, 4, 1]
需要注意的点

由于列表是可变类型,因此如果使用浅拷贝会改变原始值、目标值。
登录后复制

plain 复制代码
b=[3,2] #原始值
print(b)  #  输出结果 [3, 2]
c=b #浅拷贝 C为目标值

c[0]=1 
print(b) #目标值改变导致原始值改变 输出结果 [1, 2]
print("//")
print(c)  # 输出结果 [1, 2]
b[0]=4 
print(c) #原始值改变导致目标值改变 输出结果 [1, 2]

若不想改变可用深拷贝
登录后复制

plain 复制代码
##深拷贝互不影响
import copy
b=[3,2] #原始值
print(b)  # 输出结果 [3, 2]
c=copy.deepcopy(b) #深拷贝 C为目标值

c[0]=1 
print(b) #目标值改变,不影响原始值  输出结果 [3, 2]
print("//")
print(c) # 输出结果[1, 2]
b[0]=4 
print(c) #原始值改变,不影响目标值 # 输出结果[1, 2]

二、dict字典类型:

用于存储关联关系的数据,标识{键:值, key:value}键值对之间用逗号隔开, 字典中key值具有唯一性,不能重复
登录后复制

plain 复制代码
a = {'x': 10, 'y': 20}
print(a, type(a))
#>>>{'x': 10, 'y': 20} <class 'dict'>

创建字典

  • dict()函数,通过列表(元组)或命名参数建立字典
  • {key1:value1,key2:value2,......key_n:value_n}

登录后复制

plain 复制代码
items =[["bill","1234"],("Mike",'423'),["mary",'34234']]
d = dict(items)
print(d)
# 使用命名参数
dict_items = dict(name='Bill',number=2542,grade='A')
print(dict_items)
dict_item={'color': 'red', 'size': '20', 'type': 'bold'}
print(dict_item)

# 通过zip()函数将两个可迭代对象打包成元组,第一个参数是字典的键,第二个参数为字典值
dict_ = dict(zip([102,103,104],['路人甲','路人乙','路人丙'])
print(dict_)

字典的基本操作

1、dict内访问键值对

print(a['key']) 通过字典内的key可直接获取value
登录后复制

plain 复制代码
a = {'x': 10, 'y': 20}
print(a['x'])
#>>>10
2、dict内修改键值对:

x['key']='zz' 通过获取value的方式,将新的值赋值给value
登录后复制

plain 复制代码
a = {'x': 10, 'y': 20}
a['x'] = 15
print(a)
#>>>{'x': 15, 'y': 20}
3、dict内增加键值对:

x['key']='yy' 通过修改不存在的键值对方式,直接将不存在的键值对添加至字典内
登录后复制

plain 复制代码
a = {'x': 10, 'y': 20}
a['z'] = '张三'
print(a)
#>>>{'x': 10, 'y': 20, 'z': '张三'}
4、dict内删除键值对:

del x['key'],.pop ('key')
登录后复制

plain 复制代码
a = {'x': 10, 'y': 20}
del a['x']
print(a)
#>>>{'y': 20} 

a = {'x': 10, 'y': 20}
a.pop('x')
print(a)
# >>>{'y': 20} 


a = {'x': 10, 'y': 20}
b = a.pop('x')
print(b)
# >>>10
5、list内的元素作为dict的key:

x.fromkeys(y,"none")

fromkey方法,用于将列表内的元素作为字典的key来使用,注:需要先创建空字典,然后再将列表内的元素作为字典内的key
登录后复制

plain 复制代码
x = {}
y = ['name', 'age', 'sex']
dict1 = x.fromkeys(y, 'none')
print(dict1)
# >>>{'name': 'none', 'age': 'none', 'sex': 'none'}
6、dict内多个键值对进行更新:

a.update(b) 注:此函数没有返回值

将b的键-值对更新到字典a 中,b可以是字典、列表等;此函数亦可作修改字典使用(相同的key,不同的value)
登录后复制

plain 复制代码
dict_ = {}  # 创建空字典
dict_.update({'x': 10, 'y': 20})  # 传字典
print(dict_)
#>>>{'x': 10, 'y': 20}
dict_.update([('j', 30), ('k', 40)])  # 传列表
print(dict_)
#>>>{'x': 10, 'y': 20, 'j': 30, 'k': 40}
dict_.update(e=50, f=60)  # 传关键字
print(dict_)
#>>>{'x': 10, 'y': 20, 'j': 30, 'k': 40, 'e': 50, 'f': 60}
dict_.update(x='张三', y='李四')  # 修改字典内容
print(dict_)
#>>>{'x': '张三', 'y': '李四', 'j': 30, 'k': 40, 'e': 50, 'f': 60}
7、dict遍历:

items()、keys()、values()

  • items() 方法把字典中每对 key 和 value 组成一个元组,并把这些元组放在列表中返回。
  • keys()方法把字典的key视图
  • values返回字典的值试图

登录后复制

plain 复制代码
dict_sample = {102: '张三', 105: '李四', 109: '王五'}
print("---遍历键---")
for sample_id in dict_sample.keys():
    print("学号:" + str(sample_id))

print("---遍历值---")
for sample_name in dict_sample.values():
    print("学生:" + str(sample_name))

print("---遍历键:值---")
for s_id,s_name in dict_sample.items():
    print("学号:{0} - 学生:{1}".format(s_id, s_name))

三、set集合类型:

是一种可迭代的、无序的、不能包含重复元素的容器类型数据

set的操作

创建集合

可以使用大括号 { } 或者 set() 函数创建集合。

注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。创建非空集合只能使用{ }
登录后复制

plain 复制代码
x = {'张三', '李四', '王二'}
y = set()
print(x, type(x), y, type(y))
# >>>{'张三', '王二', '李四'} <class 'set'> set() <class 'set'>

set内不能有重复的值
登录后复制

plain 复制代码
x = {'张三', '李四', '王二', '张三'}
print(x)
# >>>{'张三', '王二', '李四'}
添加元素

.add(),将需要添加的元素当做一个整体,添加到集合中去。如果元素已经存在,则不能添加,不会抛出错误
登录后复制

plain 复制代码
x = {1,2}
x.add('python') 
print(x)	# 添加字符串 
#>>>{1, 2, 'python'} 

x = {1, 2}
y = ('python', 'java')
x.add(y)	# 添加元组
print(x)
#>>>{1, 2, ('python', 'java')}

.update()是把要传入的元素拆分,做为个体传入到集合中(如传入列表、集合、元组等,拆分后作为个体传入)
登录后复制

plain 复制代码
x = {1, 2}
y = ('python')
x.update(y)    # 添加字符串
print(x)
#>>>{'t', 1, 2, 'p', 'n', 'y', 'o', 'h'}  x = {1, 2}
y = ['python', 'java']
x.update(y)    # 添加元组
print(x)
#>>>{1, 2, 'python', 'java'}
删除元素
remove(elem)

如果元素不存在,则抛出错误
登录后复制

plain 复制代码
x = {'python', 'java', 'php'} x.remove('php') 
print(x) 
#>>>{'python', 'java'}
discard 方法

如果元素不存在集合中,那么程序不会报错
登录后复制

plain 复制代码
x = {'python', 'java', 'php'} 
x.discard('php') 
print(x) 
#>>>{'python', 'java'}
pop 方法

随机删除集合中的一个元素,并返回被删除的元素,如果集合为空,程序报错
登录后复制

plain 复制代码
x = {'python', 'java', 'php'}
y = x.pop()
print(x,y)
z = set()
d=z.pop() # KeyError: 'pop from an empty set'
print(d,z)
difference_update方法

删除集合x与序列y的重复元素
登录后复制

plain 复制代码
x = {1, 2, 3}
y = [3, 4, 5]
x.difference_update(y)
print(x)
#>>>{1, 2}
intersection_update方法

删除集合A中与序列B不重复的元素
登录后复制

plain 复制代码
x = {1, 2, 3}
y = [3, 4, 5]
x.intersection_update(y)
print(x)
#>>>{3}
clear()清除集合

登录后复制

plain 复制代码
x = {'python', 'java', 'php'}
print(x)  #输出结果{'php', 'python', 'java'} 
x.clear()
print(x)  #输出结果set()
set集合运算

x&y交集,x|y并集, x-y差集, x^y非交集
登录后复制

plain 复制代码
x = {'python', 'java'}
y = {'python', 'sql'}
print(x & y, x | y, x - y, x ^ y)
#>>> {'python'} {'sql', 'python', 'java'} {'java'} {'sql', 'java'}
set内是否有重复:

.isdisjoint()

使用isdisjoint方法,用于判断两个集合是否不含相同的元素,如果不含返回 True,如果含有返回 False
登录后复制

plain 复制代码
x = {'python', 'java'}
y = {'python', 'sql'}
z = x.isdisjoint(y)
print(z)
#>>>False  x = {'python', 'java'}
y = {'php', 'sql'}
z = x.isdisjoint(y)
print(z)
#>>>True

总结:

  • 序列元素是有序的,其中列表是可变的,元组是不可变
  • 集合元素是无序的,且不能重复
  • 字典通过键来访问元素,由键视图和值视图构成,键视图不能包含重复的元素

列表(List)

优点:
  • 有序性:列表中的元素按照插入的顺序排列,支持索引访问。
  • 灵活性:可以动态添加、修改或删除元素,适合用于需要频繁变更的数据集合。
  • 异构性:可以容纳不同类型的元素,如整数、字符串、对象等。
区别:
  • 与其他三种相比,列表的主要区别在于其可变性和异构性,但这也使得它在某些情况下不如集合或字典高效。

集合(Set)

优点:
  • 唯一性:自动去除重复元素,适合用于需要确保元素唯一性的场景。
  • 高效查找:基于哈希表实现,提供了快速的成员测试和交、并、差等集合运算。
  • 无序性:不保证元素的顺序,适合于对顺序不敏感的数据处理。
区别:
  • 集合的独特之处在于其唯一性和无序性,适用于需要快速查找和处理无序数据集合的情况。

字典(Dict)

优点:
  • 键值对:通过键(必须唯一)快速访问值,提供高效的映射关系存储。
  • 灵活性:键可以是几乎任何不可变类型,支持动态添加、修改键值对。
  • 无序性:虽然Python 3.7+中字典保持了插入顺序,但本质上字典是无序的。
区别

字典的核心优势在于键值映射,适合构建复杂的数据结构,如缓存、配置等。

元组(Tuple)

优点:
  • 不可变性:一旦创建,元素便不可更改,这有助于保护数据免受意外修改。
  • 轻量级:相比于列表,元组在内存占用上更小,因为它是静态数据结构。
  • 可作为字典键:由于其不可变性,元组可以直接作为字典的键使用。
区别:
  • 元组的主要特征是不可变性和轻量级,适用于不需要修改的固定数据集合,如函数返回多个值的场景。
相关推荐
理想不理想v8 分钟前
使用JS实现文件流转换excel?
java·前端·javascript·css·vue.js·spring·面试
码农研究僧9 分钟前
详细分析ip addr show 查看网络配置的命令
linux·tcp/ip·ip addr show
hutaotaotao10 分钟前
c语言用户不同命令调用不同函数实现
c语言·开发语言
码狂☆10 分钟前
ubuntu连接orangepi-zero-2w桌面的几种方法
linux·ubuntu
huangjiazhi_11 分钟前
QTcpSocket 服务端和客户端
开发语言·qt
ac-er888826 分钟前
ThinkPHP中的MVC分层是什么
开发语言·php·mvc
学习向前冲28 分钟前
安装一键式重置密码插件(Linux)-CloudResetPwdAgent
linux·运维·服务器
惜.己28 分钟前
Jmeter中的配置原件(四)
java·前端·功能测试·jmeter·1024程序员节
EasyNTS29 分钟前
无插件H5播放器EasyPlayer.js网页web无插件播放器vue和react详细介绍
前端·javascript·vue.js
guokanglun1 小时前
Vue.js动态组件使用
前端·javascript·vue.js