Day3-字典,切片
字典
字典用大括号 {} 定义,存放键值对(key-value),一个key只能对应一个value,key值在一个字典内唯一,不能有重复的key,value 可以重复
字典相对于 list 来说,字典有以下几个特点:
1、查找和插入的速度极快,不会随着 key 的增加而变慢
2、需要占用大量的内存,内存浪费多
而 list 相反:
1、查找和插入的时间随着元素的增加而增加
2、占用空间小,浪费内存少
所以字典是用空间来换取时间的一种方法
举个例子,假设要根据同学的名字查找对应的成绩,如果用 list 实现,需要两个 list, 一个存名字,一个村成绩
names = ['Li', 'Chen', 'C'] scores = [95, 75, 85]
给定一个名字,查找对应的成绩
name = 'Li' for i in range(len(names)): if names[i] == name print(scores[i]) break
如果用 字典 实现,只需要一个 名字-成绩 的对照表,直接根据名字查找成绩
>>> d = {'Li': 95, 'Chen': 75, 'C': 85}
>>> d['Li']
95
把数据放入字典 的方法除了初始化时指定外,还可以通过 key 插入
>>> d['Li'] = 88 >>> d['Ly'] = 77 >>> d {'Li': 88, 'Chen': 75, 'C': 85, 'Ly': 77}
可以看出,用这种方法插入数据,如果 key 已存在,那么 key 的值会被替换,如果 key 不存在,就存放一个新的键值对
那么如果在存放数据时,不想改变原有的键值对该怎么办?
setdefault(key, value) 可以实现
>>> d.setdefault('Li', 20) 88 >>> d.setdefault('Lei', 15) 15 >>> d {'Li': 88, 'Chen': 75, 'C': 85, 'Ly': 77, 'Lei': 15}
通过上述代码可以看出,setdefault 方法不会改变原有的键值对,如果是新的键值对,那就加入 字典
判断字典中的存在不存在
>>> d {'Li': 45, 'Chen': 75, 'C': 85, 'Ly': 77, 'Lei': 15} >>> d['Lii'] # key 不存在,程序报错 Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 'Lii' >>> d.get('Lii') # key 存在返回 value, 不存在返回默认返回 None 一般建议使用这种方法判断 key,程序不会报错 >>> print(d.get('Lii')) None >>> print(d.get('Lii', -1)) # 可以指定 key 不存在时返回的值 -1 >>> print(d.get('Li', -1)) # key 存在时返回 value 45
>>> 'a' in d # key 存在时返回 True, 不存在返回 False
False
删除字典中的值有四种方法,pop、popitem、del、clear
>>> d {'Li': 45, 'Chen': 75, 'C': 85, 'Ly': 77, 'Lei': 15} >>> d.pop('Li') # 指定 key 删除 45 >>> d {'Chen': 75, 'C': 85, 'Ly': 77, 'Lei': 15} >>> d.popitem() # 随机删除一个 ('Lei', 15) >>> d {'Chen': 75, 'C': 85, 'Ly': 77} >>> del d['Ly'] # 指定 key 删除 >>> d {'Chen': 75, 'C': 85} >>> d.clear() # 清空字典 >>> d {}
字典的 update(key/value) 方法,传入的参数为键值对,表示键值对的方法有很多种,如下代码所示
>>> D = {} >>> D.update({'three': 3, 'four': 4}) # 传一个字典 >>> print(D) {'three': 3, 'four': 4} >>> D.update(one = 1, two = 2) # 传关键字 >>> D {'three': 3, 'four': 4, 'one': 1, 'two': 2} >>> D.update([('five', 5), ('six', 6)]) # 传一个包含多个元组的列表 >>> D {'three': 3, 'four': 4, 'one': 1, 'two': 2, 'five': 5, 'six': 6} >>> D.update(one = 111, two = 222) # 也可以更改 key 对应的 value >>> D {'three': 3, 'four': 4, 'one': 111, 'two': 222, 'five': 5, 'six': 6}
字典中的value 的数据类型也可以是字典,列表 ,tuple等,取值赋值就会比较复杂,需要一层层展开,再用对应的数据类型所对应的方法对数据进行增删改查
# 学生每日交作业情况 >>> homework = { ... '小破': {'2018-03-20': '未交', '2018-03-21': '已交', '2018-03-22': '未交'}, ... '小明': {'2018-03-20': '已交', '2018-03-21': '已交', '2018-03-22': '未交'} ... } # 查看小破同学 2018-03-21 的作业情况 >>> homework[0]['2018-03-21'] Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 0 >>> homework['小破']['2018-03-21'] '已交' # 增加一个键值对 >>> homework['小明'] = ['小明生病了'] >>> homework {'小破': {'2018-03-20': '未交', '2018-03-21': '已交', '2018-03-22': '未交'}, '小明': ['小明生病了']}
# key 小明 对应的 value 是一个列表,那么就可以用 append 方法添加元素,其他数据类型以此类推 >>> homework['小明'].append('小明住院了') >>> homework {'小破': {'2018-03-20': '未交', '2018-03-21': '已交', '2018-03-22': '未交'}, '小明': ['小明生病了', '小明住院了']}
切片
切片是 list 取值的一种方式,也适用于 字符串
以 list 数据类型为例
>>> L [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] >>> L[1:4] # 从下标 1(包含)到 4(不包含)取值,顾头不顾尾 [1, 2, 3]
>>> L[1:] # 如果从某个位置开始取值到末尾,则尾数可以省略
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
>>> L[:4] # 如果从下标0开始取值到某个下标,则0可以省略
[0, 1, 2, 3]
>>> L[:] # 去所有值
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
>>> L[::-1] # 负数代表从右到左开始取值,
[19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
>>> L[::-2] # -2代表步长,从右到左隔两个取值
[19, 17, 15, 13, 11, 9, 7, 5, 3, 1]
>>> L[::2] # 从左到右隔两个取值,其他以此类推
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
>>> L
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
# 切片操作都不会改变list本身的值,是产生了新的list
>>> L1
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
>>> L1.reverse()
>>> L1
[19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
字符串的一些常用方法
去空格
>>> a = ' sldjl \n\n ' >>> c = a.strip() # 默认去掉两边的空格和换行符 >>> c 'sldjl' >>> c = a.lstrip() # 去掉左边的空格和换行符 >>> c 'sldjl \n\n ' >>> c = a.rstrip() # 去掉右边的空格和换行符 >>> c ' sldjl' >>> a ' sldjl \n\n '
取特定字符的下标
>>> s = ' today is one day' >>> s.index('s') # 如果字符存在,返回下标值,不存在程序报错 9 >>> s.index('z') # 字符 'z' 不在字符串中,程序报错 Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: substring not found >>> s.find('z') # 字符不存在,返回-1 -1 >>> s.find('s') # 字符存在,返回下标值 9
判断字符串是否以特定字符串开始或结束
>>> s ' today is one day' >>> s.startswith('') # 是否以特定字符串开始,是返回 True,否则返回 False True >>> s.startswith('s') False >>> s.endswith('ay') # 是否以特定字符串结尾,是返回 True,否则返回 False True
替换字符串
>>> s.replace('one', 'TWo') # 以指定字符串替换原有的字符串 ' today is TWo day'
判断字符串的组成
>>> a
'adsasd21312ASD' >>> a.isalnum() # 判断字符串是否含有数字和字母,只要含有字母或数字就返回 True True >>> a.isalpha() # 判断字符串是否全为字母 False >>> s = 'ASDASDsdaad' >>> s.isalpha() True >>> s.isdigit() # 判断字符串是否全为数字 False >>> c = '2131231' >>> c.isdigit() True
大小写转换
>>> a = 'ASDasd' >>> a.upper() # 字符串全部转换成大写 'ASDASD' >>> a.lower() # 字符串全部转换成小写字母 'asdasd' >>> a # 字符串的方法并未改变字符串本身的值 'ASDasd'

浙公网安备 33010602011771号