一、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)
优点:
- 不可变性:一旦创建,元素便不可更改,这有助于保护数据免受意外修改。
- 轻量级:相比于列表,元组在内存占用上更小,因为它是静态数据结构。
- 可作为字典键:由于其不可变性,元组可以直接作为字典的键使用。
区别:
- 元组的主要特征是不可变性和轻量级,适用于不需要修改的固定数据集合,如函数返回多个值的场景。