上一篇我们已经认识和了解了列表的基本操作,今天做一下简单补充说明,同时进一步对元组、字典、集合这几个容器类型进行学习。
一.列表的几点补充
1.列表的值[a, b, c],类型是对象
2.对象类型: 列表、字典、集合、元素、通过类创建的对象
3.变量在存储对象数据的时候,存的对象保存在内存中的地址。如果用存对象的变量给另外一个变量赋值,赋的是地址
注意:如果变量里存的对象,要注意赋值的时候,如果不想要两个变量互相影响,就不要直接赋值而是拷贝对象产生新的对象然后赋值 list.copy( )
【例】
list1 = [1, 2, 3, 4]
list2 = list1[:]
list3 = list1.copy()
list3[1] = 100
list2[0] = 10
print(list3)
print(list2)
print(list1)
输出:
[1, 100, 3, 4]
[10, 2, 3, 4]
[1, 2, 3, 4]
二、元组
1.概念:
元祖(tuple)就是不可变的列表,列表中除了增加、修改和删除相关的操作,其他都适用于元祖
2.什么时候用元组?
就是存到容器中的数据不能被修改的时候使用,例如:星期几对应的值
3.声明一个元组
tuple1 = (1, 2, 3, 4, 'aa', True)
print(tuple1)
输出:(1, 2, 3, 4, 'aa', True)
注意小括号和列表的中括号区分
4.查
print(tuple1[0]) 注意此时里面的元素位置用中括号[]代表
print(tuple1[-1])
print(tuple1[:3])
输出:
1
True
(1, 2, 3)
注意取元素和取坐标的区别!!!
for item in tuple1:
print(item)
for index in range(len(tuple1)):
print(tuple1[index])
两种方式都分别会依次打印出元组中元素
5. + , *运算
print((1, 2, 3) + ('a', 'b', 'c'))
print((1, 'a') * 3)
输出:
(1, 2, 3, 'a', 'b', 'c')
(1, 'a', 1, 'a', 1, 'a')
6.in ,和not in操作
a = 10
print(a in (10, 2, 9, 9))
print(a not in (10, 2, 9, 9))
输出:
True
False
【练习】要求:输入1-7的数字,对应输入是星期几。例如:输入1,就输出"星期一"。输入7就输出'星期日'
weeks = ('星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期日')
while True:
input_value = int(input('请输入1~7:'))
print(weeks[input_value-1])
这里注意
(1)类型的转换Int不要忘记,input函数的使用要正确
(2)坐标从0开始,所以最后面要-1
(3)input_value是个变量,我只是为了见名知意,这个换成x是等价
weeks = ('星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期日')
while True:
x = int(input('请输入1~7:'))
print(weeks[x-1])
三、字典
1.基本概念
(1)字典是一个容器类的数据类型,以键值对(key:value)的形式来存储数据
(2)键值对:键:值的形式存在。
键:理论上只能是不可变的数据类型的数据,实际开发中一般用字符串作为key 值:可以是任何类型的数据;
(3)字典是可变的(说明可以增、删、改、查),但是是无序的(不能使用下标来访问元素)
2.定义/声明一个字典(dict)
dict1 = {'name': '小明', 'age': 18}
dict2 = {'score': 100, 10: 'aaa', (1, 3):[10, 23]}
print(dict2)
注意:
小明需要加引号;键值对的键是字符串所以也需要引号
可变的数据不能作为字典的key
dict3 = {[10, 12]: 'abc'} # 会报TypeError错误
# print(dict3)
3.查
(1)获取单个元素的值——通过key去获取值: 字典名[key值]
注意: 使用字典名[key]的形式去获取字典中元素的值的时候,key值必须是在字典中存在的。否则报KeyError异常
【例】
print(xiaoming['age'])
print(xiaoming['face'])
通过get方法获取值: 字典名.get(key值)
获取字典中,不确定key对应键值对是否存在的时候,使用get去获取其对应的值
print(xiaoming.get('name'))
print(xiaoming.get('abc')) # 结果是None
注意:None:python中的一个特殊值,表示没有,类似C中的NULL
【例】取字典中的'grade'对应的值,如果grade不存在就打印'不存在',否则直接打印'grade'对应的值
value = xiaoming.get('grade')
if value == None:
print('不存在')
else:
print(value)
(2)遍历字典
遍历字典拿到的是字典中所有的key值;在开发中使用这种方法去遍历字典,用[]不用get,因为key是真实存在的
for key in dict3:
print(key, dict3[key])
注意:下面这个在开发的时候不建议使用,因为在获取键值对前需要一些转换的操作,消耗CPU
or (key, value) in dict3.items():
print(key, value)
4.修改:通过key去拿到对应的元素,重新赋值
dict3 = {'a': 1, 'b': 2, 'c': 3}
dict3['a'] = 10
print(dict3)
输出{'a': 10, 'b': 2, 'c': 3}
【例】将上面的字典中所有的值变为原来的3倍
for key in dict3:
# dict3[key] = dict3[key] * 3
dict3[key] *= 3
print(dict3)
{'a': 30, 'b': 6, 'c': 9}
5.增加
通过key取值,然后赋值(如果这个key不存在,就是添加键值对。如果key存在,就是修改这个key对应的值)
注意:字典里面的key是唯一的
6..删除(删除的是键值对)
a. del语句
格式: del 字典[key]
dict1 = {'a': 10, 'b': 10.3, 'c': False, 'd': [1, 2, 3]}
del dict1['b'] # 删除'b'对应的键值对
print(dict1)
输出:{'a': 10, 'c': False, 'd': [1, 2, 3]}
b. pop方法
格式: 字典.pop(key) 结果是被删除的键值对的值
dict1 = {'a': 10, 'b': 10.3, 'c': False, 'd': [1, 2, 3]}
result = dict1.pop('a') # 结果是被删除的键值对的值
print(dict1, result)
输出:{'b': 10.3, 'c': False, 'd': [1, 2, 3]} 10
popitem方法: 随机删除(取出)一个元素
dict1 = {'a': 10, 'b': 10.3, 'c': False, 'd': [1, 2, 3], 'aa': 100}
dict1.popitem()
print(dict1)
【例】将字典中,值为字符串的全部删除
dict1 = {'a': 10, 'str': 'string', 'b': 10.3, 'c': False, 'd': [1, 2, 3], 'aa': 'haha'}
print(dict1)
for key in dict1.copy():
value = dict1[key] # 取键对应的值
if isinstance(value, str): # 判断值是否是字符串
dict1.pop(key) # 移除key对应的键值对
输出 {'a': 10, 'b': 10.3, 'c': False, 'd': [1, 2, 3]}
7.keys和values方法
字典.keys(): 获取字典中所有的key,结果是一个列表
字典.values(): 获取字典中所有的值, 结果是一个列表
8. update
字典1.update(字典2) :用字典2中的元素去更新字典1中的元素(如果字典2中的键值对字典1没有,就直接添加。有的话就修改)
【例】
dict1 = {'a': 1, 'b': 2, 'c': 3}
dict1.update({'d': 123, 'e': 'hhh', 'a': 100})
print(dict1)
输出:{'a': 100, 'b': 2, 'c': 3, 'd': 123, 'e': 'hhh'}
9.in 和 not in 判断字典中是否有指定的key
print('a' in dict1)
print(100 in dict1)