字典、列表、集合相关操作。

列表相关的函数

  1. append 向列表的末尾添加新的元素
  2. insert 在指定索引之前插入元素
  3. extend 迭代追加所有元素(要求:数据的类型是可迭代性数据)

  1. pop 通过指定索引删除元素,若没有索引移除最后那个
  2. remove 通过给予的值来删除,如果多个相同元素,默认删除第一个,指定值进行删除,如果有多个相同的重复值,默认删掉第一个
  3. clear 清空列表

改、查

列表的改和查参见列表的切片操作。

其他函数

  • index 获取某个值在列表中的索引
  • 列表.index(值[,start][,end]) # [] 表达参数可选项 找不到报错
  • count 计算某个元素出现的次数。区别:字符串里面的count 可以划定范围,列表里面的count不行。
  • sort() 列表排序(默认小到大排序),默认从小到大,排序英文 (ascii 编码) :一位一位进行比较,在第一位相同的情况下,比较第二位,以此类推。
  • reverse() 列表反转操作

浅拷贝 和 深拷贝

Python的内存管理机制,决定了我们拷贝的运行机制。在Python中整数类型是解释器自动产生一定范围的数,当我们把一个值赋值给另外一个变量的时候,并不是在开辟一块新的内存空间,而是把变量绑定向了那个值。
字符串是一种不可变类型,当我们把一个字符串绑定到一个变量的时候,也并未立即开辟新的内存空间来做拷贝,只有当我们对字符串操作的时候,才会开辟内存空间把操作产生的新对象放在里面,存放系列的操作。

s1 = '123456  '
s2 = s1
print(id(s1),id(s2))
s2 = s2.strip()
print(id(s1),id(s2))
运行结果:
1902430840560 1902430840560
1902430840560 1902430841200

与之不同的是,在c语言中,在定义变量的时候编译器就在内存开辟一块空间,并把值存放在对应变量绑定的内存空间之中。

列表这种不可变类型的数据结构的拷贝不能通过在编码中的简单赋值来解决,需要导入一个copy的模块。

l1 = ['apple','banana','cherry','durian']
l2 = l1
l2.append('fig')
print(l1,id(l1),id(l2))
运行结果:
['apple', 'banana', 'cherry', 'durian', 'fig'] 1830546650240 1830546650240

我们可以看出L1和L2的id相同,L2操作L1的值也发生变化,在时间编码中这显然是不合理的,我们的需求通常是拷贝一分数据,并操作,同时保留原来列表,在Python中用copy模块来解决这个问题。

import copy
l1 = ['apple','banana','cherry','durian']
l2 = l1.copy()
l2.append('fig')
print(l1,id(l1))
print(l2,id(l2))
运行结果
['apple', 'banana', 'cherry', 'durian'] 2892911228160
['apple', 'banana', 'cherry', 'durian', 'fig'] 2892911228352
  • 方法一: copy.copy 模块.方法 l2 = copy.copy(l1)
  • 方法二 :列表.copy()
    这两种方法编写方法本质上没什么区别。
    在列表的拷贝中右浅拷贝和深拷贝两种:
    浅拷贝 只拷贝一级容器中的所有数据
    深拷贝 拷贝所有层级的所有元素
    结合c语言来理解,浅拷贝相当于拷贝了一级容器中的全部内容,而二级容器存放在一级容器中的是它的地址,拷贝了地址,但地址指向的数据仍旧是可以变化的,新旧列表对于耳机容器指向的仍旧是同一块内存空间,当二级容器的值发生变化是,两个列表同时改变。这种情况是在一定条件下是不允许的。所以要引入深拷贝来解决。深拷贝函数如下:
l2 = copy.deepcopy(l1)

注意:(深拷贝在执行时: 如果是不可变数据,地址会暂时的指向原来数据, 如果是可变数据,直接开辟新空间)。

字典相关函数

  1. 直接通过键值对来增加

dic={}
dic['A'] ='apple'
print(dic) 
运行结果:
{'A': 'apple'}
  1. fromkeys() 使用一组键和默认值创建字典
lst = ["A","B","C"]
dic = {}.fromkeys(lst,None)
print(dic)
运行结果:
{'A': None, 'B': None, 'C': None}

这种形式值得注意的是,值不能是可变数据类型

lst = ["A","B","C"]
dic = {}.fromkeys(lst,[])
print(dic)
dic["A"].append(1)
print(dic)
运行结果:
{'A': [], 'B': [], 'C': []}
{'A': [1], 'B': [1], 'C': [1]}
三个键所指向的列表是同一个

1. pop() 通过键去删除键值对 (若没有该键可设置默认值,预防报错)

dic = {"top":"花木兰" , "middle":"甄姬" , "bottom":"孙尚香" ,  "jungle" : "钟馗" , "support":"蔡文姬" }
res = dic.pop("top")
print(res)
运行结果:
花木兰
pop()的返回值是一个删除键所对应的值。

如果删除的是不存在的键,直接报错,可以设置默认值,防止报错,如下:

dic = {"top":"花木兰" , "middle":"甄姬" , "bottom":"孙尚香" ,  "jungle" : "钟馗" , "support":"蔡文姬" }
res = dic.pop("top",'hhh')
print(res)
res = dic.pop("top123","hhh")
print(res)
运行结果:
花木兰
hhh
——————
当正常删除时弹出对应值,当键不存在的时候,弹出我们设定的默认值。

2. popitem() 删除最后一个键值对

dic = {"top":"花木兰" , "middle":"甄姬" , "bottom":"孙尚香" ,  "jungle" : "钟馗" , "support":"蔡文姬" }
res = dic.popitem()
print(res, dic)
print(type(res))
运行结果:
('support', '蔡文姬') {'top': '花木兰', 'middle': '甄姬', 'bottom': '孙尚香', 'jungle': '钟馗'}
<class 'tuple'>
————————————————
能看出来这种情况下返回值是一个由键和值组成的元组。

3. clear() 清空字典

dic = {"top":"花木兰" , "middle":"甄姬" , "bottom":"孙尚香" ,  "jungle" : "钟馗" , "support":"蔡文姬" }
dic.clear()
print(dic)
运行结果:
{}

  1. update() 批量更新(有该键就更新,没该键就添加)
 dic = {"top":"花木兰" , "middle":"甄姬" , "bottom":"孙尚香" ,  "jungle" : "钟馗" , "support":"蔡文姬" }
new_dic = {'召唤师':"ayan",'middle':'周瑜'}
print(dic)
dic.update(new_dic)
print(dic)
运行结果:
{'top': '花木兰', 'middle': '甄姬', 'bottom': '孙尚香', 'jungle': '钟馗', 'support': '蔡文姬'}
{'top': '花木兰', 'middle': '周瑜', 'bottom': '孙尚香', 'jungle': '钟馗', 'support': '蔡文姬', '召唤师': 'ayan'}

 dic = {"top":"花木兰" , "middle":"甄姬" , "bottom":"孙尚香" ,  "jungle" : "钟馗" , "support":"蔡文姬" }
dic.update(top="张良",主播="hape")
print(dic)
运行结果
{'top': '张良', 'middle': '甄姬', 'bottom': '孙尚香', 'jungle': '钟馗', 'support': '蔡文姬', '主播': 'hape'}

get() 通过键获取值(若没有该键可设置默认值,预防报错)

  • get()函数是典型的鸭子类型很多object都由这种方法。

其他函数

在字典的使用中,我们常常由遍历操作,Python提供了下面三种函数:

  • keys() 将字典的键组成新的可迭代对象
dic = {"top":"花木兰" , "middle":"甄姬" , "bottom":"孙尚香" ,  "jungle" : "钟馗" , "support":"蔡文姬" }
print(dic.keys())
运行结果:
dict_keys(['top', 'middle', 'bottom', 'jungle', 'support'])
  • values() 将字典中的值组成新的可迭代对象
dic = {"top":"花木兰" , "middle":"甄姬" , "bottom":"孙尚香" ,  "jungle" : "钟馗" , "support":"蔡文姬" }
print(dic.values())
运行结果:
dict_values(['花木兰', '甄姬', '孙尚香', '钟馗', '蔡文姬'])
  • items() 将字典的键值对凑成一个个元组,组成新的可迭代对象
dic = {"top":"花木兰" , "middle":"甄姬" , "bottom":"孙尚香" ,  "jungle" : "钟馗" , "support":"蔡文姬" }
print(dic.items())
运行结果:
dict_items([('top', '花木兰'), ('middle', '甄姬'), ('bottom', '孙尚香'), ('jungle', '钟馗'), ('support', '蔡文姬')])

集合的相关操作

交集

vege_set = {"apple","tomato","banana","cucumber"}
fruit_set = {"tomato","cucumber",'potato',"eggplant"}
res = vege_set.intersection(fruit_set)
print(res)
运行结果:
{'cucumber', 'tomato'}

简写 &
res = set1 & set2
print(res)

差集
#difference()

vege_set = {"apple","tomato","banana","cucumber"}
fruit_set = {"tomato","cucumber",'potato',"eggplant"}
res = vege_set.difference(fruit_set)
print(res)
运行结果:
{'apple', 'banana'}

简写 -
res = set1 - set2
print(res)

并集
union()

vege_set = {"apple","tomato","banana","cucumber"}
fruit_set = {"tomato","cucumber",'potato',"eggplant"}
res = vege_set.union(fruit_set)
print(res)
运行结果:
{'eggplant', 'tomato', 'cucumber', 'banana', 'apple', 'potato'}

简写 |
res = set1 | set2

对称差集 (补集情况涵盖在其中)

vege_set = {"apple","tomato","banana","cucumber"}
fruit_set = {"tomato","cucumber",'potato',"eggplant"}
res = vege_set.symmetric_difference(fruit_set)
print(res)
运行结果:
{'potato', 'apple', 'banana', 'eggplant'}

简写 ^
res = set1 ^ set2

判断是否是子集
issubset()

vege_set = {"apple","tomato","banana","cucumber"}
litset = {"tomato","cucumber"}
res = vege_set.issubset(litset)
print(res)
res = litset.issubset(vege_set)
print(res)
运行结果:
False
True

简写 <
res = set1 < set2
print(res)
判断是否是父集
issuperset()

res = set1.issuperset(set2)
print(res)

简写 >
res = set1 > set2
print(res)

检测两集合是否不相交 不相交 True 相交False
isdisjoint()

res = set1.isdisjoint(set2)
print(res)

集合相关的函数

setvar = {“AK47”,“M4A1”}

  1. #add() 向集合中添加数据 (一次加一个)
setvar = {"AK47","M4A1"}
setvar.add("AWM")
print(setvar)
运行结果:
{'M4A1', 'AK47', 'AWM'}
  1. update() 迭代着增加 (一次加一堆)
setvar = {"AK47","M4A1"}
strvar = ("98K","MP5")
setvar.update(strvar)
print(setvar)
运行结果:
{'M4A1', 'AK47', 'MP5', '98K'}

#clear() 清空集合

setvar = {"AK47","M4A1"}
setvar.clear()
print(setvar)
运行结果:
set()

pop() 随机删除集合中的一个数据

setvar = {"AK47","M4A1"}
res = setvar.pop()
print(res , setvar)

remove() 删除集合中指定的值(不存在则报错)(了解)

setvar = {"AK47","M4A1"}
setvar.remove("AK47")
print(setvar)

discard() 删除集合中指定的值(不存在的不删除 推荐使用)

setvar = {"AK47","M4A1"}
setvar.discard("M4A1")
setvar.discard("98K")
print(setvar)

冰冻集合

frozenset 可强转容器类型数据变为冰冻集合
冰冻集合一旦创建,不能在进行任何修改,只能做交叉并补操作
不能够在冰冻集合当中添加或者删除元素
只能交差并补

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值