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'

 

posted @ 2018-03-30 19:05  飒蓝  阅读(175)  评论(0)    收藏  举报