这一章是列表和字典的笔记,下一章是元组和集合的笔记。
列表[ ]
列表是一个“大容器”可以存储N多个元素,程序可以方便地对这些数据进行整体操作。列表相当于其他语言中的数组。
创建方式:1使用[] 2 调用函数list
lst=['hello','world',98] lst2= list(['hello','world',99])
列表的索引是面向对象的,其结构如图所示:
✪列表的特点:
1.列表元素有序排列
2.索引映射唯一一个数据
3.列表可以重复存储一个数据
4.任意数据类型混存
5.根据需要动态分配和回收内存
字典{ }
字典是Python内置的数据结构之一,与列表一样是一个可变的序列。以键值对的方式存储,字典是一个无序的序列。要求key是一个不可变的序列,根据哈希函数,计算出该键值存储的位置。
创建方式:1.使用{} 2.使用dict()
scores = {'张三':100,'李四':98,'王五':45} print(scores) print(type(scores)) student =dict(name='jack',age=20) print(student) d={} print(d)
✪字典的特点:
1.字典中的所有元素都是一个key-value对,key不允许重复,value可以重复。
2.字典中的元素可以是无序的。
3.字典中的key必须是不可变对象。
4.字典也可以根据需要动态地伸缩。
5.字典是一种使用空间换时间的数据结构,会浪费较大的内存。
列表元素的索引: lst.index()
1.根据元素的值,获取单个元素的索引
lst=['hello','world',98,'hello'] print(lst.index('hello')) #如果列表中相同元素,只返回列表中相同元素第一个元素的索引 #print(lst.index('Python')) ValueError: 'Python' is not in list print(lst.index('world',1,3)) #在范围内查找
2.获取列表的单个元素 正向索引,逆向索引
lst=['hello','world',98,'hi','word',92] print(lst[1]) #正向索引,获取索引为1的元素——world print(lst[-4]) #逆向索引,获取索引为-4的元素——98 # print(lst[10]) #IndexError: list index out of range
3.使用切片操作获取列表中的多个元素
切片范围:[start,stop)前闭后开的区间,切片之后获得一个新的列表,因为id值不同。
lst3= list([0,1,2,3,4,5,6,7,8,9]) print('原列表的id',id(lst3)) print('切片列表的id',id(lst3[1:6:1])) print(lst3[1:6:1]) #start:1 stop:6 step: 1
start、stop、 step有默认值。
当step为正数时,切片的第一个元素默认为列表的第一个元素,切片的最后一个元素为列表的最后一个元素。
当step为负数时,切片的第一个元素默认为列表最后一个元素,切片的最后一个元素默认为列表的第一个元素。
lst3= list([0,1,2,3,4,5,6,7,8,9]) print(lst3[:6:2]) print(lst3[::2]) print(lst3[::]) print(lst3[1::2]) print('步长是负数的情况') print(lst3[::-1]) #倒着排列 print(lst3[7::-1]) print(lst3[9:0:-2])
列表元素的查询操作
1.判断指定元素是否在列表中存在:
print('p'in 'python') #True print('k'in 'python') #False lst=[10,20,'Python','hello'] print(10 in lst) #True print(100 in lst) #False
2列表元素的遍历
for item in lst: print(item) #对列表里面的内容依次进行输出 print(lst) #两种输出的方式是不一样的哦
列表元素的增、删、改操作
1.四种方法向列表中增加元素
①append()在末尾添加一个元素,append()里面的元素也可以是一个链表
lst=[10,20,'Python','hello'] lst2= list(['hello','world',99]) print('添加元素之前',lst,id(lst)) lst.append(100) print('第一次添加元素之后',lst,id(lst)) lst.append(lst2) print('第二次添加元素之后',lst,id(lst))
结果为:
添加元素之前 [10, 20, 'Python', 'hello'] 2279505916160
第一次添加元素之后 [10, 20, 'Python', 'hello', 100] 2279505916160
第二次添加元素之后 [10, 20, 'Python', 'hello', 100, ['hello', 'world', 99]] 2279505916160
②extend()在列表的末尾至少添加一个元素
lst=[10,20,'Python','hello'] lst2= list(['hello','world',99]) lst.extend(lst2) print('第三次添加元素之后',lst,id(lst))
结果为:
第三次添加元素之后 [10, 20, 'Python', 'hello', 'hello', 'world', 99] 2443520110848
③insert()在列表任意位置添加一个元素
lst=[10,20,'Python','hello'] lst.insert(1,90) print('第四次添加元素之后',lst,id(lst)) #insert()在在1的位置添加90
结果为:
第四次添加元素之后 [10, 90, 20, 'Python', 'hello'] 1952250720448
④切片操作,在列表的任意位置添加至少一个元素
lst3= list([0,1,2,3,4,5,6,7,8,9]) lst=[10,20,'Python','hello'] print('lst3:',lst3) lst[1:2]=lst3 #切片操作:lst 1,2,3的位置被切掉换成lst3 print(lst)
结果为:
lst3: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[10, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'Python', 'hello']
2.五种方法列表删除元素的操作
①remove()一次移除一个元素,如果没有这个会报错
lst=[10, 0, 1, 2, 3, 4, 5, 6, 7, 8, 99, 'hello', 'hello', 'world', 99] lst.remove(99) #remove()从列表移除一个元素,如果有重复元素只移除一个 print(lst)
②pop()将索引为1的位置移除,如果不指定参数默认最后一个,如果没有,会报错
lst=[10,20,30,40,50,60,30] lst.pop(1) print(lst) lst.pop() print(lst)
③切片,一次至少删除一个元素,将产生一个新的列表对象有两种操作方式
lst=[20,30,40,50,60] new_lst=lst[1:3] print('原来的列表',lst,id(lst)) #切片至少删除一个元素, print('新来的列表',new_lst,id(new_lst)) #有一点像剪纸建模型的操作 lst[1:3]=[] print('"剪窗花"的列表',lst,id(lst))
结果为:
原来的列表 [20, 30, 40, 50, 60] 1834526044416
新来的列表 [30, 40] 1834526044800
"剪窗花"的列表 [20, 50, 60] 2246257144000
④clear()清除列表中的所有元素
lst.clear() print(lst)
⑤del将列表对象都删除
del lst #del直接删除,打印都都打不出来,因为没有定义 del lst2 del lst3
3.列表元素修改操作
lst=[10,20,30,40,50] lst[2]=100 print(lst) #[10, 20, 100, 40, 50] lst[1:3]=[100,200,300,400] print(lst) #[10, 100, 200, 300, 400, 40, 50]
列表的排序操作
指定函数关键字,可以实现升序或降序排序
①sort(),原列表的基础上进行,指定函数关键字,可以实现升序或降序排序
lst = [10, 100, 200, 300, 400, 40, 50] print('排序前的内容',lst,id(lst)) lst.sort() #sort()升序排列,在原列表的基础上进行的 print('升排序后的内容',lst,id(lst)) lst.sort(reverse=True) #sort(reverse=True)就是降序排序 print('降序排序后的内容',lst,id(lst))
②sorted(),产生一个新的列表对象,指定函数关键字,可以实现升序或降序排序
lst = [10, 100, 200, 300, 400, 40, 50] print('原列表',lst) new_lst = sorted(lst) print(lst,id(lst)) print(new_lst,id(new_lst)) #id明显不一样 desc_lst = sorted(lst,reverse=True) print(desc_lst,id(desc_lst))
列表生成式
要求列表中的元素有一定的规则。
lst2=[i*i for i in range(1,10)] #[表示列表元素的表达式 for 自定义变量 in range()] print(lst2)
获取字典中的元素
1.两种方法获取字典中的value:第一种:使用[ ],第二种:使用.get() 更好
scores = {'张三':100,'李四':98,'王五':45} print(scores['张三']) #100 #print(scores['陈留']) #错误:KeyError: '陈留' print(scores.get('张三',)) #100 print(scores.get('陈留')) #None print(scores.get('陈留','不存在')) #返回 不存在
2.key的判断
scores = {'张三':100,'李四':98,'王五':45} print('张三'in scores) #True print('张三'not in scores) #False
字典的删、增、该操作
①del 删除指定的key-value对,clear()清空所有元素
scores = {'张三':100,'李四':98,'王五':45} del scores['张三'] #{'李四': 98, '王五': 45} print(scores) scores.clear() #{}
②字典元素的新增操作,
字典是无序的,所以不需要指定位置,哈希函数会根据key值,选定一个位置。
scores = {'张三':100,'李四':98,'王五':45} scores['陈留']=100 #新增元素 print(scores)
字典的视图
①keys()---->获取字典中所有的key
scores = {'张三':100,'李四':98,'王五':45} keys = scores.keys() print(keys) #dict_keys(['张三', '李四', '王五']) print(type(keys)) #<class 'dict_keys'> print(list(keys)) #将所有的key组成的视图转化为列表:['张三', '李四', '王五']
②values()---->获取字典中所有的value
scores = {'张三':100,'李四':98,'王五':45} values = scores.values() print(values) #dict_values([100, 98, 45]) print(type(values)) #<class 'dict_values'> print(list(values)) #将所有的values组成的视图转化为列表:[100, 98, 45]
③items()----->获取字典中所有的key.value对
scores = {'张三':100,'李四':98,'王五':45} items = scores.items() print(items) #dict_items([('张三', 100), ('李四', 98), ('王五', 45)]) print(type(items)) #<class 'dict_items'> print(list(items)) #将所有的items(元组)组成的视图转化为列表:[('张三', 100), ('李四', 98), ('王五', 45)]
字典元素的遍历
参考“获取字典中的值”给的两种方法。
scores = {'张三':100,'李四':98,'王五':45} for item in scores: print(item,scores[item],scores.get(item))
结果为:
张三 100 100
李四 98 98
王五 45 45
字典生成式
zip(),将可迭代的对象作为参数,将对象中对应的元素打包成一个元组,然后返回这些元组组成的列表,生成一个字典
items = ['Fruits','Books','Others'] prices = [96,78,85,100,120] d={item:prices for item,prices in zip(items,prices)} print(d)
结果为:{'Fruits': 96, 'Books': 78, 'Others': 85}
如果元素不相同,打包时以元素短的那个来生成