元组
元组(tuple)的结构与列表类似,可以存储不同类型的数据。但元组中的元素是不可变的,一经创建就不能再做修改,不能再次赋值。因此元组没有append(),insert(),remove()之类的方法。
元组的适当使用能够让代码更加安全,防止错误赋值导致重要对象的改变。
a=(1,2,"Genshin") #创建元组a
print(a[0]) #a[0]=1
集合
和数学上的集合(set)一样,集合具有无序性。在集合中没有重复的元素,因此可用于去除相同的元素。集合可以进行数学上的交、并、差等运算。集合的创建如下:
a=set() #创建空集合
a={1,2,3} #创建集合,元素为1,2,3
#不能用a={}创建空集合!!!
#可以把列表或元组转化为集合
a=set([1,2,3])
a=set((1,2,3))
若赋值s={1,2,3,1},s会自动去除重复的元素,s={1,2,3}。集合的其他运算如下表:
函数 | 其他表示 | 说明 |
a.add(x) | 把元素x加入集合a | |
a.remove(x) | 把元素x从集合a删除 | |
a.union(b) | a|b | 求a∪b |
a.intersection(b) | a&b | 求a∩b |
a.difference(b) | a-b | 差集,在a中而不在b中的元素 |
a.symmetric_difference(b) | a^b | 对称查,a∪b-a∩b |
a.issubnet(b) | 判断a是否是b的子集,返回bool型 | |
a.issupernet(b) | 判断b是否是a的子集,返回bool型 | |
a.isdisjoint(b) | 判断a和b是否有公共元素,有为True |
无论对列表、元组还是集合,都可以用"a in b"查找某元素是否在数据结构中:
a={1,2,3}
b=[1,2,3]
c=(1,2,3)
if 1 in a:
print("1 in a")
if 1 in b:
print("1 in b")
if 1 in c:
print("1 in c")
字典
字典(dict)在C/C++中也被称为哈希映射或散列表,用于描述数据的键与值之间的映射关系。字典的应用能显著降低时间和空间复杂度。
设想你要用C语言存储学号101~109的9名同学的考试成绩,最原始的做法是开辟一个二维数组,两个维度分别存储学号和成绩。当查找时依次遍历数组,这种算法的时间复杂度是O(n),空间消耗是2n。
a[0] | a[1] | a[2] | a[3] | a[4] | a[5] | a[6] | a[7] | a[8] |
101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 |
成绩1 | 成绩2 | 成绩3 | 成绩4 | 成绩5 | 成绩6 | 成绩7 | 成绩8 | 成绩9 |
但如果使用哈希表,可以把学号101~109通过函数Hash(x)=x-101映射到0~8(恰好用数组下标表示),这时只需要开辟一个一维数组,并用a[0]存储101号同学成绩,a[1]存储102号同学成绩……访问时把x带入Hash()可直接得到它的存储位置,这种算法的时间复杂度是O(1),空间消耗是n。比起前者得到了极大的改善!Hash(x)被称为哈希函数或散列函数。
a[0] | a[1] | a[2] | a[3] | a[4] | a[5] | a[6] | a[7] | a[8] |
成绩1 | 成绩2 | 成绩3 | 成绩4 | 成绩5 | 成绩6 | 成绩7 | 成绩8 | 成绩9 |
Python中的字典以键值对的方式存储以上信息,"101","102"和"103"称为键,成绩称为值。
{"101":成绩1,"102":成绩2,"103":成绩3}
字典的创建方式如下:
a={} #创建空字典
b=dict([("圆皮","原神"),("皱皮","明日方舟")])
c={'圆皮': '原神', '皱皮': '明日方舟'}
print(b) #b=c={'圆皮': '原神', '皱皮': '明日方舟'}
#还可以结合for循环和zip函数创建字典
keys=["圆皮","皱皮"]
value=["原神","明日方舟"]
D1={}
for k, v in zip(keys, value):
D1[k]=v
#或简写为:
D2=dict(zip(keys, value))
对字典索引有两种方法:
print(D1["圆皮"]) #打印“原神”
print(D1["农批"]) #不存在这个键,报错
print(D1.get("圆皮")) #打印“原神”
print(D1.get("圆皮", 20)) #设20为默认值,有"圆皮"键打印值"原神"
print(D1.get("农批", 20)) #没有这个键,打印默认值20,
可以用in判断是否存在这个键,可以用keys()和values()查看所有的键和值:
print("圆皮" in D1) #打印"True"
print(D1.keys()) #打印["圆皮", "皱皮"]
print(D1.values()) #打印["原神","明日方舟"]
可以更新或删除键:
D1.update({"原皮":"Genshin"})
print(D1) #{"圆皮":"原神","皱皮":"明日方舟","原皮":"Genshin"}
del D1["原皮"]
print(D1) #{"圆皮":"原神","皱皮":"明日方舟"}
D1.pop("原皮")
print(D1) #{"皱皮":"明日方舟"}
D1.clear() #清除全部元素,返回空列表
关于JSON
JSON(JavaScript Object Notation)是一种数据交换格式,类似的还有XML、HTML等。JSON以键值对的方式存储了数据的属性和值,有利于进行数据交换和读取。一些常见的应用有config配置文件、网络传输、数据集等。例如:
在Python中使用JSON库读取json文件,将其转换为字典(键值对)进行处理:
import json
with open(".\config.json", "r", encoding="utf-8") as f:
config = json.load(f)
base_path=config['data_path']
可以利用json库中的.load()函数把字符串转换为json格式,用.dumps()函数把json转换为字符串:
import json
s1='''{"圆皮":"原神","皱皮":"明日方舟"}'''
dict_=json.loads(s) #dict_为JSON格式
s2=json.dumps(dict_) #s1=s2,为字符串格式