一、字典---存储多个数据的无序的 可变的 以键值对表示的数据类型  

字典表示

1.字典的定义 dictionary

2.关键字 dict 除列表以外python之中最灵活的内置数据结构类型,字典是无序的对象集合

3.字典用{}标识

4.字典是无序的对象集合

5.用key:value 的形式存储数据 键值对的方式   {key: value, key1: value1, key2: value2}

  注:列表存储多个数据的时候,并不知道元素具体表示的含义。

        字典:用key:value ,可以表示出每个元素的具体含义

dict1 = {'name':'Lili','age':'18','gender':'girl'}

 6.字典 key的硬性要求:

  key:是唯一的不可变的数据(int float tuple boolen str)除此以外,其他的类型都不支持做key(列表,字典不能作为key,因为它们是可变的)

  value:任何数据类型都支持

注:key大多数都是用str

       如果报错类型是unhashable,说明key是可变的类型,要修改key的类型.

 

字典的常用操作

1.空字典

d = {}

2.定义一个字典

不能用字典 列表作key

#定义一个字典 key:value
d={1:(1,2,3),0.02:False,True:'result','name':0.02}#True也可表示1,所有输出结果,1:'result'
print(d)
结果:{1: 'result', 0.02: False, 'name': 0.02}#多次输出结果的顺序都是不一样的,体现无序

 ❤字典的key必须是唯一的不重复的,如果出现重复的,后面的值会把前面的值覆盖掉。上例中的1等同与True,后面的‘result’会把前面的(1,2,3)给覆盖掉

 ❤ 报keyerror 说明字典的key有问题

 

3.字典的取值:根据key取值,没有索引,没有切片(因为有索引,就代表有顺序,列表,元组是有序的,字典是无序的)

无序:就无法通过索引取值

取值:根据key取值,即字典名[key]

python3.8版本,字典的无序做了优化,老版本3.3,每次运行结果的顺序是一样的。

d={1:(1,2,3),0.02:False,True:'result','name':0.02}#True也可表示1,所有输出结果,1:'result'
print(d[0.02])

结果:False

 

4.字典的长度

dict1 = {'name':'Lili','age':'18','gender':'girl'}
print(len(dict1)) #3

 

5.字典的基本操作------增删改查,都是根据key来操作

①查:根据key来查询

d={'python':'29期','teacher':['华华','yuze','妮妮'],'vip':{1:'小李',2:'小张',3:'小赵'}}
print(d['vip'])
print(d['vip'][2])
print(d['teacher'][1])

结果:

{1: '小李', 2: '小张', 3: '小赵'}
小张
yuze

 

②增 d[不存在的key]=新值

③改 d[存在的key]=新值

主要区别就是key是不是已存在的,存在就是改,不存在就是增

d={'python':'29期','teacher':['华华','yuze','妮妮'],'vip':{1:'小李',2:'小张',3:'小赵'}}
d['vip']='vip学员'
d['total']=999
print(d)

结果:{'python': '29期', 'teacher': ['华华', 'yuze', '妮妮'], 'vip': 'vip学员', 'total': 999}

 

 ④删除

d.pop()(注意,是按照key来删除,其次没有列表里面默认删除最后一个的操作!!!)

d.pop('vip')#根据key来删除

d.clear()  清空字典

d.popitem() 删除字典中的最后一对键和值。如果字典已经为空,却调用了此方法,就报出 KeyError 异常

 

6.字典的方法函数

①keys()  把字典的所有key放在一个列表里,以元组方式输出

②values() 把字典的所有value值放在一个列表里,以元组的方式输出

③items() 字典的中每个键值对放在一个元组里,元组再放在一个列表里,最后以元组方式输出

dict1 = {'name':'python','clasee':29,'year':2020}
print(dict1.keys())
print(dict1.values())
print(dict1.items())

结果:

dict_keys(['name', 'clasee', 'year'])
dict_values(['python', 29, 2020])
dict_items([('name', 'python'), ('clasee', 29), ('year', 2020)])

 

7.字段的运算:减法运算、与运算

d1 = {1: 11, 2: 22}
    d2 = {1: 11, 2: 31, 3: 44}
    c = d1.items() - d2.items()  # d1中删除跟d2相同的key:value,剩余的是返回值
    e = d2.items() - d1.items()  # d2中删除跟d1相同的key:value,剩余的是返回值
    d = d1.items() & d2.items()  # d1 跟 d2的交集(与运算)
    print(c)  # {(2, 22)}
    print(e)  # {(2, 31), (3, 44)}
    print(d)  # {(1, 11)}

 

8.get() 函数返回指定键的值

get()方法语法:

dict.get(key[, value])

参数

  • key -- 字典中要查找的键。
  • value -- 可选,如果指定键的值不存在时,返回该默认值。

返回值

  返回指定键的值,如果键不在字典中返回默认值 None 或者设置的默认值。

tinydict = {'Name': 'Runoob', 'Age': 27}

print ("Age : ", tinydict.get('Age'))

 

 

灵活拷问:

什么时候用字典?字典是用来存储数据的

如果是顺序比较重要的,可修改的,就用列表。如果是可读性比较重要的,就用字典。(当值是用来成对存储的时候,例如,学生对应的成绩)

举例:测试登录,注册场景,设计测试用例。

数据分析:

登录地址      方法        数据

  /login           GET     caojuan

 register        POST   longlong

case = [

{'url':'/login','method':'GET','data:'caojuan'},

{............},

{.............}

]

 

二、元组---不可变

1.元组的表示:()

2.元组与列表一样,也是一种序列,唯一不同的是元组不能修改。

 

创建和访问元组(元组最重要的是小括号()、逗号)

1.空元组() 

2.不带小括号的元组

 tuple1 = 1,2,3

3.带小括号的元组

 tuple2 = (1,2,3,4)

❤❤注意:元组中只有一个元素,需要加上逗号;不加逗号的话,其数据类型就是这个元素的数据类型,不是元组了。

4.一个元素的元组

names = ('hello')  == 'hello'
print(len(names)) #5
#加逗号 names = ('hello', ) print(len(names)) # 1 print(type(names)) # tuple

 

5.元组的重复

tuple3 = (8,)
print(tuple3*8)#(8, 8, 8, 8, 8, 8, 8, 8)

(8,)是元组,此时的*不是乘号,而是重复操作符。

 

索引、更新和删除元组

1.元组是有序的,可以通过索引操作

tuple4 =  ('polo','Emma','Dinal','Jones')
print(tuple4[2])  #Dinal

2.元组是不可修改的序列,又怎么进行更新呢?------利用切片方式,实现元组的连接

#在'Emma'和'Dinal'之间插入'Lili'
tuple4 =  ('polo','Emma','Dinal','Jones')
tuple4 =  tuple4[:2] + ('Lili',) + tuple4[2:]
print(tuple4)      # ('polo', 'Emma', 'Lili', 'Dinal', 'Jones')

 

3.删除元组  del

4.元组的拆包,解包

a, b, c = ('hello', 'love', 'python')
print(a)   #hello
print(b)   #love
print(c)   #python

赋值号= 前面的变量(a,b,c)的个数与元组的元素个数一定要相同,否则会报错

 

元组的相关操作符

1.重复操作符*(8 *(8,))

2.逻辑操作符 and  or

3.成员关系操作符 in, not in

4,拼接操作符+(拼接操作符两边的元素类型要一致)

5,关系操作符(>, >=,<,<=)

 

什么时候用元组

1.在信息不能进行修改的情况下,用元组

2.元组的性能要强于列表(测试的时候感受不到,基本上用列表就够 了)

 

 

三、集合 set

1.集合的表示方法 :{ }   

{“hello”,“python”,“lemon”,”vip”}

2.集合与字典的区别;集合是没有key的

my_set = {'hello','python','lemon','vip'}
print(my_set)  #{'lemon', 'hello', 'python', 'vip'}
print(len(my_set))# 4

 

3.集合是无序的 可变 ====→不能索引

可以通过内置函数()来操作,暂时不讲。

4. ❤集合的主要作用:去重

set会把重复的元组覆盖掉

my_set = {'hello','python','lemon','vip','python','hello','python'}
print(my_set)  #{'python', 'vip', 'lemon', 'hello'}
print(len(my_set)) #4

面试题:

把下面的列表去除重复元素

list1=['hello','python','lemon','vip','python','hello','python']
print(list(set(list1))) #['python', 'vip', 'lemon', 'hello'] 集合去重后是无序的,顺序是变化的