"""
创建字典的方式
"""
# 第一种方式
dict1 = {"zs": "张三", "ls": "李四", "ww": "王五"}
print(dict1["zs"])
# 可以通过给不存在的建赋值动态添加字典元素
dict1["zl"] = "赵六"
print(dict1)
# 第二种方式 通过 dict() 创建,以 键 = 值 的形式传入参数,其中键不能加引号
dict2 = dict(zs="张三", ls="李四", ww="王五")
print(dict2)
dict3 = dict({("zs", "张三"), ("ls", "李四"), ("ww", "王五")})
print(dict3)
dict4 = dict({"zs": "张三", "ls": "李四", "ww": "王五"})
print(dict4)
dict5 = dict({"zs": "张三", "ls": "李四"}, ww="王五")
print(dict5)
dict6 = dict(zip({"zs", "ls", "ww"}, {"张三", "李四", "王五"}))
print(dict6)
"""
字典的增删改查
增 :
fromkeys(iterable[ ,values])
适用于从无到有创建一个字典,可以快速初始化一个字典
删 :
pop(key[ ,default])
删除字典中指定的元素,返回被删除的元素
如果删除的元素不存在,会抛出异常,但如果传入 default 参数,就会返回 default
popitem()
python3.7 前是随机删除字典中的一个键值对
3.7后是删除字典中最后一个加入的键值对
返回被删除的键值对
del 运算符、 clear() 函数都可以使用
改 :
可以直接通过 字典[键] = 值 的方式修改单个元素
update([other])
给该函数传入多个键值对,或传入另外一个字典,或一个包含键值对的可迭代对象
实现一键修改多个键值对的值
查 :
可以直接通过 字典[键] 查找,但是如果字典中没有该键就会报错
get(key[ ,default])
传入 default 参数,当键不存在时返回 default
setdefault(key[ ,default])
当找不到 key 时,向字典中添加 字典[key] = default ,然后返回 default
items()
获取字典的所有键值对
keys()
获取字典的所有键
values()
获取字典的所有值
"""
# 增
d = dict.fromkeys("python", 1)
print(d) # {'p': 1, 'y': 1, 't': 1, 'h': 1, 'o': 1, 'n': 1}
# 修改某个键的值,如果该键不存在,就会创建一个新的
d['p'] = 10
print(d)
# 删 pop()
print(d.pop('y')) # 1
# print(dict.pop('4')) # 抛出异常
print(d.pop('4', "没有该元素")) # 没有该元素
# popitem()
print(d.popitem()) # ('n', 1)
# 改 update()
d = dict.fromkeys("pyth")
print(d) # {'p': None, 'y': None, 't': None, 'h': None}
d.update({"p": 1, "y": 2})
print(d) # {'p': 1, 'y': 2, 't': None, 'h': None}
d.update(t=3, h=4) # 键不能加引号
print(d) # {'p': 1, 'y': 2, 't': 3, 'h': 4}
# 查
# get()
print(d.get("p")) # 1
print(d.get("a", "不存在")) # 不存在
# setdefault()
print(d.setdefault("p", "11")) # 1
print(d.setdefault("a", "aaa")) # aaa
print(d) # {'p': 1, 'y': 2, 't': 3, 'h': 4, 'a': 'aaa'}
# items() keys() values()
items = d.items()
keys = d.keys()
values = d.values()
print(items)
print(keys)
print(values)
"""
字典的浅拷贝
copy()
"""
d = dict.fromkeys("python", 1)
d1 = d.copy()
print(d1) # {'p': 1, 'y': 2, 't': 3, 'h': 4, 'a': 'aaa'}
"""
字典嵌套
"""
# 字典中嵌套字典
d = {"zs": {"语文": 90, "数学": 87}}
# 访问字典中的字典
print(d["zs"]["语文"]) # 90
# 字典中嵌套列表
d = {"zs": [10, 20, 30]}
print(d["zs"][0]) # 10
"""
字典推导式(同列表推导式)
{express for target in iterable}
{express for target in iterable if condition}
"""
d = {"a": 1, "b": 2, "c": 3}
dd = {v: k for k, v in d.items()}
print(dd) # {1: 'a', 2: 'b', 3: 'c'}
user = {"username": "user_exist", "password": "123456"}
user.update({"confire": "123"})
print(user)
"""
列表的添加
append()
extend()
"""
heros = [1, 2, "hangsan"]
# 向列表末尾添加元素
heros.append([1,2,3]) # 追加一个列表
print(heros)
# 一次性向列表添加多个元素
heros.extend(["a","b","c"]) # 参数为一个可迭代对象(列表、元组、字符串等)
heros.extend("1ds") # 参数为一个可迭代对象(列表、元组、字符串等)
print(heros)
# 也可以使用切片实现 append() 和 extend()方法
s = [1,2,3]
s[len(s):] = [4]
"""
以下写法均会报错
s[4:] = 5
s[4] = [5]
s[4] = 5
"""
print(s)
# 在列表的任意位置插入元素: insert(待插入的位置,待插入的元素)
s = [1,3,4,5]
s.insert(1,2)
print(s)
# 在列表的最后一个位置插入元素,则相当于 append() 方法
s.insert(len(s),6)
print(s)
"""
列表的删除
remove()
(1)当列表中有多个相同元素时,指挥删除第一个匹配到的
(2)如果删除的元素列表中不存在,会报错
pop():删除指定位置的元素
clear():清空列表
"""
s = [1, 3, 4, 5]
s.append(2)
s.remove(2)
# s.remove(11) # ValueError: list.remove(x): x not in list
print(s)
# 删除某个位置上的元素: pop(要删除元素的下标),返回被删除的元素
x = s.pop(0)
print(x)
print(s)
# 清空列表
s.clear()
print(s)
"""
列表的修改
"""
s = [1, 2, 3, 4, 5]
# 通过索引修改某一个位置的元素
s[2] = "str"
print(s)
# 利用切片一次性替换多个元素
# 将 = 左边指定的位置的内容清除
# 然后将 = 右边的可迭代对象中的片段插入左边被删除的位置
# 右边的内容可以比左边删除的内容多、少或等于
# 可以将切片位置后的所有元素替换为 = 右边的元素
s[3:] = ["s", "a", "b", "23"]
print(s)
"""
列表排序 sort()
列表翻转 reverse()
上述两种方法均会改变原数组
"""
nums = [4, 3, 6, 47, 35, 9, 2, 5, 3]
nums.sort() # 默认升序排序
print(nums)
# 实现降序排序:可以将升序排序的结果翻转
nums.reverse()
print(nums)
# 实现降序排序的第二种方法,传入一个reverse = True 的参数
nums = [4, 3, 6, 47, 35, 9, 2, 5, 3]
nums.sort(reverse=True) # 降序排序
print(nums)
"""
列表的查找
count(要查找的元素) :查找元素在列表中出现的次数
index(要查找的元素) :查找元素在列表中索引
找不到元素时会报错
当列表有多个相同元素时,返回查找到的第一个元素的索引
还可以指定范围: index(要查找的元素,start,end)
返回 start~end 范围的第一个元素,不包括 end 的位置
"""
nums = [3, 2, 5, 2, 3, 5, 3, 1, 8, 7]
# count(要查找的元素) :查找元素在列表中出现的次数
count = nums.count(3) # 查找元素 3 在列表中出现的次数
print(count)
# index(要查找的元素) :查找元素在列表中索引
# 当列表有多个相同元素时,返回查找到的第一个元素的索引
index = nums.index(5)
print(index)
nums[nums.index(3)] = "变为字符串3"
print(nums)
# print(nums.index(78)) # 报错
"""
列表的拷贝
(1)方式一: copy()
(2)方式二: 切片
(3)方式三:导入 copy 模块,调用模块中的copy():copy.copy(要拷贝的列表)
(4)方式四:深拷贝,调用 copy 模块中的 deepcopy():copy.deepcopy(要拷贝的列表)
上述(1)(2)(3)三种拷贝都是浅拷贝
"""
nums = [3, 2, 5, 2, 3, 5, 3, 1, 8, 7]
# copy() 方法
copy_nums1 = nums.copy()
print(copy_nums1)
# 切片方式
copy_nums2 = nums[:]
print(copy_nums2)
nums = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
copy_nums = nums.copy()
nums[0][0] = 11
# 修改列表元素nums[0][0], copy_nums也受到了影响,所以copy()是浅拷贝
print("copy_nums:", copy_nums)
# 深拷贝
import copy
nums = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
copy_nums = copy.deepcopy(nums)
nums[0][0] = 11
# 修改列表元素nums[0][0], copy_nums也受到了影响,所以copy()是浅拷贝
print("copy_nums 深拷贝:", copy_nums)
列表的加法和乘法
"""
列表的加法和乘法
加法:即列表的拼接,要求加号两边都是列表
乘法:重复列表内的所有元素若干次
"""
list1 = [1, 2, 3]
list2 = [4, 56]
# list2 = 4 # 报错,加号的两边要是列表
# 列表的加法
print(list1 + list2)
# 列表的乘法
print(list1 * 2)
"""
嵌套列表
"""
# 嵌套列表的两种写法
list1 = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
list2 = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
print(list1)
print(list2)
# 嵌套列表的访问
for i in list1:
for j in i:
print(j, end=" ")
print()
print(list1[0][0])
# 创建二维列表
a = [0] * 3
# print(a)
for i in range(len(a)):
a[i] = [0] * 3
print(a)
# [[0,0,0]]
# 以下这种创建二维列表的方式看起来是正确的,但实际上会存在问题
b = [[0] * 3] * 3 # [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
# 存在的问题
# 只修改第一个列表中的第一个元素,
# 但实际上却是: b = [[1, 0, 0], [1, 0, 0], [1, 0, 0]]
b[0][0] = 1
print(b)
# 问题的原因:
# 正常情况下,不同的列表指向不同的地址,所以当某个元素修改时不会影响其他元素
print(a[0] is a[1] is a[2]) # False
# 但乘号重复列表中的元素只是把原有的内容引用了多次,实际上并没有开辟新的内存空间
# 所以出现了问题
print(b[0] is b[1] is b[2]) # True
"""
is 和 is not 称为同一性运算符,用于检测对象的 id 值是否相等,即判断两个变量是不是同一对象
在 python 中,每一个对象都有三个属性, 唯一标示(id)、类型和值
id 值:在对象创建的时候就有,不可以被修改,也不会有重复值
in 和 not in 判断的是包含问题
in 运算符用于判断某个元素是否包含在序列中
not in 运算符用于判断某个元素是否不包含在序列中
"""
# is 运算符: 检验两个变量是否指向同一个对象
str1 = "zhangsan"
str2 = "zhangsan"
print(str1 is str2) # True
list1 = [1, 2, 3]
list2 = [1, 2, 3]
print(list1 is list2) # False
"""
列表推导式
基本语法:[express for target in iterable]
列表推导式的结果一定是一个列表,所以需要中括号[]
列表推导式的效率比 for 循环的效率要高
"""
# 用列表推导式实现将列表中的每一个元素都乘以2
list = [1, 2, 3, 4, 5]
list = [i * 2 for i in list]
print(list)
list = [i for i in range(5)]
print(list)
list = [i + 1 for i in range(5)]
print(list)
list = [c * 2 for c in "zhangsan"]
print(list)
# ord() 将单个字符串转换为对应的编码
list = [ord(c) for c in "zhangsan"]
print(list)
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
# 将二维列表里的每一行的第二列元素提取出来
list = [i[1] for i in matrix]
print(list)
# 提取二维列表的副对角线元素
list = [matrix[i][2 - i] for i in range(3)]
print(list)
# 用列表推导式创建二维列表
list = [[0] * 3, [0] * 3, [0] * 3]
print(list)
list[0][0] = 1
print(list)
# 用列表推导式代替上述代码
list1 = [[0] * 3 for i in range(3)]
print(list1)
list1[0][0] = 1
print(list1)
"""
进阶版列表推导式(添加条件判断)
基本语法:[express for target in iterable if condition]
每一次执行完 for 语句的迭代之后,会先执行 if 条件判断,最后执行左侧的表达式
即顺序为:for 语句迭代 ——> if 条件判断 ——> 左侧的表达式
"""
list = [i for i in range(10) if i % 2 == 0]
print(list) # [0, 2, 4, 6, 8]
list = [i + 1 for i in range(10) if i % 2 == 0]
# 变成了奇数,证明最后执行的是左侧的表达式
print(list) # [1, 3, 5, 7, 9]
"""
嵌套列表推导式
基本语法:[express for target1 in iterable1
for target2 in iterable2
.....
for targetN in iterableN]
"""
# 将一个二维列表降级为一维列表
list = [col for row in matrix for col in row]
print(list)
# 对应的 for 循环语句
list = []
for row in matrix:
for col in row:
list.append(col)
print(list)
"""
进阶版嵌套列表推导式
基本语法:[express for target1 in iterable1 if condition1
for target2 in iterable2 if condition2
.....
for targetN in iterableN if conditionN]
"""
list = [[x, y] for x in range(5) if x % 2 == 0 for y in range(5) if y % 2 != 0]
print(list)
# 对应的 for 循环写法
_ = [] # 下划线表示一个临时变量
for x in range(5):
if x % 2 == 0:
for y in range(5):
if y % 2 != 0:
_.append([x, y])
print(_)
""" 元组,也是一个序列 元组使用小括号表示 但实际上没有小括号也行,但是要有逗号隔开 元组是不可变的,所以增删改查中只有查,其他操作不可以进行 其他的操作基本和列表一致(包括切片) """
# 元组定义
tuple = (1, 2, 3)
print(tuple)
tuple = 4, 5, 6
print(tuple)
# 生成只有一个元素的元组(重点是要加逗号)
singleTuple = (1,)
print("单个元素的元组:", singleTuple)
# 用下标获取元组元素
print(tuple[0])
# 元组切片
_ = tuple[:]
print(_)
print(_[::-1])
print("count 方法", tuple.count(5))
print("index 方法", tuple.index(5))
# 元组加号和乘号的使用
t1 = (1, 2, 3)
t2 = (4, 5, 6)
print("加号:", t1 + t2)
print("乘号:", t1 * 2)
# 元组嵌套
t = t1, t2
print(t) # ((1, 2, 3), (4, 5, 6))
t = 1, 2, 3, (4, 5, 9)
print(t) # (1, 2, 3, (4, 5, 9))
# 元组的迭代省略,同列表
# 元组使用列表推导式(注意:结果还是一个列表)
tuple = (1, 2, 3, 4)
list = [each * 2 for each in tuple]
print(list) # [2, 4, 6, 8]
""" 打包和解包 打包:生成一个元组称为元组的打包 解包:将元组的所有元素一次性分别赋值给别的变量,称为解包 变量的个数要和元组的元素个数相对应,否则会报错 打包和解包不仅适用于元组,还适用于任何的序列类型 """
# 元组的打包和解包
tuple = (1, 2, 3) # 打包
print(tuple)
a, b, c = tuple # 解包
print("a=", a, "b=", b, "c=", c)
# 列表的打包和解包
list = ["a", "b", "c"]
x, y, z = list
print(x, y, z)
# 字符串的打包和解包
str = "123"
x, y, z = str
print(x, y, z)
# python 的多重赋值,
# 实现原理就是通过元组打包再解包
# _ = (10,20)
# x,y = _
x, y = 10, 20 # x = 10,y = 20
print(x)
print(y)
"""
集合
集合中所有元素都是独一无二的,并且也是无序的
不能用索引的方式访问
集合中的元素只能是不可变的对象(如字符串、元组),不能是可变的(如列表)
"""
# 空 {} 表示一个字典
print(type({})) #
# {} 只有一个元素且没有冒号时表示一个集合
print(type({1})) #
# {} 有元素并且有冒号表示一个字典
print(type({1:2})) #
"""
集合的创建
"""
# 使用 {}
set1 = {1,2,3}
print(set1) # {1, 2, 3}
# 使用集合推导式
set2 = {k for k in "python"}
# 显示和传入的字符顺序可能不一致
print(set2) # {'p', 'y', 't', 'o', 'n', 'h'}
set3 = set("hello")
# 不重复且无序
print(set3) # {'l', 'h', 'e', 'o'}
"""
集合内置方法
copy() :浅拷贝方法
isdisjoint() :
检测两个集合之间是否没有关系,如果没有关系则返回 True
如果集合之间有一部分相同,也视为有关系,该方法就会返回 False
issubset(参数) :
判断集合是否是参数集合的子集
issuperset(参数) :
判断集合是否是参数集合的超集
计算当前集合和其他对象共同构建的并集、交集、差集、对称差集
"""
s = {"a", "b", "c"}
print(s.isdisjoint(set("aDWE"))) # False
print(s.isdisjoint("oython")) # True
# abc 是 abcdef 的子集
print(s.issubset("abcdef")) # True
print(s.issuperset("ab")) # True
# 并集 支持多参数
print(s.union({1, 2, 3}))
print(s.union({1, 2, 3}, "hello"))
# 交集 支持多参数
print(s.intersection({1, 2, "a"}))
# 差集 支持多参数
print(s.difference({1, 2, 3}))
# 对称差集 不支持多参数
print(s.symmetric_difference("ab123"))
# 可以用运算符代替函数
# 使用运算符时,运算符两边必须是集合类型
# 使用函数参数可以是集合,也可以是可迭代对象
# <= 检测子集 >= 检测超集
print(s <= set("abcdfr"))
# < 检测真子集 > 检测真超集
print(s < set("abcde"))
# |:并集 &:交集 -:差集 ^:对称差集
"""
集合分为可变集合和不可变集合
可变集合: set
不可变集合: frozenset
上述方法都不会改变集合内容,所以 set 和 frozenset 都适用
"""
"""
只适用于 set 集合的方法
更新集合:
update(*others)
intersection_update(*others) # 交集
difference_update(*others) # 差集
symmetric_difference_update(*others) # 对称差集
添加元素:
add(要添加的元素)
删除元素:
remove(要删除的元素) 如果元素不存在抛出异常
discard(要删除的元素) 如果元素不存在不会抛出异常
pop() 随机从集合中弹出一个元素
clear() 清空集合
"""
print("---------------")
s = {1, 2, 3}
print(s)
s.update(["a", "b"], "py") # 实际上就是 union_update() 方法,因为使用较多所以省略 union
print(s) # {1, 2, 3, 'a', 'y', 'p', 'b'}
s.intersection_update("123abc") # 交集
print(s) # {'b', 'a'}
s.difference_update("123a") # 差集
print(s) # {'b'}
s.symmetric_difference_update("12b") # 对称差集
print(s) # {'2', '1'}
"""
列表、元组和字符串的相互转换
-- list() tuple() str()
"""
print(list("python")) # ['p', 'y', 't', 'h', 'o', 'n']
print(list((1, 2, 3, 4))) # [1, 2, 3, 4]
print(tuple("python")) # ('p', 'y', 't', 'h', 'o', 'n')
print(tuple([1, 2, 3, 4])) # (1, 2, 3, 4)
print(str(["python", "java"])) # ['python', 'java']
print(str((1, 2, 3, 4))) # (1, 2, 3, 4)
"""
max() min() sum() len() sorted() reversed()
sorted() 排序后返回一个全新的列表,并不会改变原列表
reversed() 返回一个迭代器对象
这些函数见名知意,不再举例
all() :
判断可迭代对象中是否所有元素的值都为真
any() :
判断可迭代对象中是否存在某个元素的值为真
"""
x = (1, 2, 0)
y = (1, 2, 3)
print(all(x)) # False
print(all(y)) # True
print(any(x)) # True
y = (0, 0, 0)
print(any(y)) # False
"""
enumerate([start]) :
该函数用于返回一个枚举对象
将该枚举对象转换为列表后就是一个二元组列表
将可迭代对象中的每个元素及从 0 开始的序号共同构成一个二元组
start : 自定义序号开始的值
"""
seasons = ["Spring", "Summer", "Fall", "Winter"]
print(enumerate(seasons)) #
# [(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
print(list(enumerate(seasons)))
# [(10, 'Spring'), (11, 'Summer'), (12, 'Fall'), (13, 'Winter')]
print(list(enumerate(seasons, 10))
"""
zip()
用于创建一个聚合多个可迭代对象的迭代器
它会将参数传入的每个可迭代对象的每个元素依次组合成元组
即第 i 个元组包含来自每个可迭代对象的第 i 个元素
如果可迭代对象的元素个数不一致,则以元素个数最少的为准
"""
x = [1, 2, 3]
y = [4, 5, 6, 7]
z = [7, 8, 9, 10]
print(zip(x, y)) #
print(list(zip(x, y))) # [(1, 4), (2, 5), (3, 6)]
# 参数个数多的部分会被丢弃
print(list(zip(x, y, z))) # [(1, 4, 7), (2, 5, 8), (3, 6, 9)]
# 若不想被丢弃,使用 itertools 模块中的 zip_longest()
import itertools
print(list(itertools.zip_longest(x, y, z))) # [(1, 4, 7), (2, 5, 8), (3, 6, 9), (None, 7, 10)]
"""
map()
会根据提供的函数对指定的可迭代对象的每个元素进行运算
并将运算结果返回
返回的是一个迭代器
"""
# ord() 返回字符对应的 Unicode 编码
print(ord("a")) # 97
print(map(ord, "abc")) #
"""
filter()
会根据提供的函数对指定的可迭代对象的每个元素进行运算
并将运算结果为真的元素以迭代器的形式返回
"""
print(list(filter(str.islower, "Python"))) # ['y', 't', 'h', 'o', 'n']