列表
定义:[ ] 内以逗号分隔,按照索引,存放各种数据类型,每个位置代表一个元素
再回顾下列表的特点:
1.可存放多个值
2.按照从左到右的顺序定义列表元素,下标从0开始顺序访问,有序
3.可修改指定索引位置对应的值,可变
列表的增加操作
append追加
数据会追加到尾部
>>> names
['alex', 'jack']
>>> names.append("rain")
>>> names.append("eva")
>>>
>>> names
['alex', 'jack', 'rain', 'eva']
insert插入
可插入任何位置,用法insert(索引,插入的内容)
>>> names.insert(2,"黑姑娘")
>>> names
['alex', 'jack', '黑姑娘', 'rain', 'eva']
extend合并
可以把另一外列表的值合并进来
>>> n2 = ["狗蛋","绿毛","鸡头"]
>>> names
['alex', 'jack', '黑姑娘', 'rain', 'eva']
>>> names.extend(n2)
>>> names
['alex', 'jack', '黑姑娘', 'rain', 'eva', '狗蛋', '绿毛', '鸡头']
列表嵌套
>>> names.insert(2,[1,2,3])
>>> names
['alex', 'jack', [1, 2, 3], '黑姑娘', 'rain', 'eva', '狗蛋', '绿毛', '鸡头']
>>> names[2][1]
2
删除操作
del删除
del通过列表的索引直接删除(从内存上删除) 用法: del list[索引]
>>> names
['alex', 'jack', [1, 2, 3], '黑姑娘', 'rain', 'eva', '狗蛋', '绿毛', '鸡头']
>>> del names[2]
>>> names
['alex', 'jack', '黑姑娘', 'rain', 'eva', '狗蛋', '绿毛', '鸡头']
注:如果删除的索引大于当前列表,会报错,错误语法为:
names=['金角大王Alex', 'Jack', 'Rain', '小明', 'Rachel', 'Mack', '小强']
del names[11]
print(names)
IndexError: list assignment index out of range
remove删除
通过列表的元素删除,如果列表有重复的值,默认删除第一个,无返回值,直接删除.如果元素不存在,会报错
names=['金角大王Alex', 'Jack', 'Rain', '小明', 'Rachel','小强',"Rain"]
names.remove("Rain")
print(names)
结果:
['金角大王Alex', 'Jack', '小明', 'Rachel', '小强', 'Rain']
如果要删除的元素不存在,报的错为:
ValueError: list.remove(x): x not in list
pop 删除
pop通过索引删除,如果不指定索引,默认是删除最后一个元素,有返回值,返回值是被pop掉的元素.
>>> names
['alex', 'jack', '黑姑娘', 'rain', 'eva', '狗蛋', '绿毛', '鸡头']
>>> names.pop() #默认删除最后一个元素并返回被删除的值
'鸡头'
>>> names
['alex', 'jack', '黑姑娘', 'rain', 'eva', '狗蛋', '绿毛']
>>> help(names.pop)
>>> names.pop(1) #删除指定元素
'jack'
pop的错误用法:
name = []
name.pop()
空列表如果用pop会报以下错误:
IndexError: pop from empty list
names=['金角大王Alex', 'Jack', 'Rain', '小明', 'Rachel','小强',"Rain"]
names.pop(22)
pop的索引如果不存在,也会报错
IndexError: pop index out of range
clear 清空
>>> n2
['狗蛋', '绿毛', '鸡头']
>>> n2.clear()
>>> n2
[]
用途:比如CS中,匪徒装的炸弹引爆,会清空所有人的生命
修改操作
>>> names
['alex', '黑姑娘', 'rain', 'eva', '狗蛋', '绿毛']
>>> names[0] = "金角大王"
>>> names[-1] = "银角大王"
>>> names
['金角大王', '黑姑娘', 'rain', 'eva', '狗蛋', '银角大王']
查看操作
index 通过元素的值找索引,有返回值,返回的是元素所在列表的索引
count查找元素在列表中的个数,有返回值,返回的是该元素在列表中的个数
>>> names
['金角大王', '黑姑娘', 'rain', 'eva', '狗蛋', '银角大王', 'eva']
>>>
>>> names.index("eva") #返回从左开始匹配到的第一个eva的索引
3
>>> names.count("eva") #返回eva的个数
2
if 'eva' in names
>>> True
查看列表里面的元素也可以通过for循环遍历(重点)
>>> for i in names:
... print(i)
...
黑姑娘
银角大王
金角大王
狗蛋
rain
eva
@
4
#
切片
切片就像切面包,可以同时取出元素的多个值
names[start:end]
>>> names
['金角大王', '黑姑娘', 'rain', 'eva', '狗蛋', '银角大王', 'eva']
>>> names[1:4] #不包含下标4的元素
['黑姑娘', 'rain', 'eva']
*切片的特性是顾头不顾尾,即start的元素会被包含,end-1是实际取出来的值
倒着切
>>> names[-5:-1]
['rain', 'eva', '狗蛋', '银角大王']
但其实我想要的是后5个,只打印了4个,’eva’这个值没出来,为什么,因为上面提到的顾头不顾尾
可是想把后5个全取出来如何做呢?
>>> names[-5:]
['rain', 'eva', '狗蛋', '银角大王', 'eva']
如果取前几个值 ,一样可以把:号左边的省掉
>>> names
['金角大王', '黑姑娘', 'rain', 'eva', '狗蛋', '银角大王', 'eva']
>>> names[0:3]
['金角大王', '黑姑娘', 'rain']
>>> names[:3] #跟上面一样的效果
['金角大王', '黑姑娘', 'rain']
步长, 允许跳着取值
names[start:end:step] #step 默认是1
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> a[0:7:2] #设置步长为2
[0, 2, 4, 6]
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>
>>> a[::3] #按步长3打印列表,第1个:是省略掉的start:end
[0, 3, 6, 9]
列表反转
>>> a[::-1] #通过把步长设置成负值,可达到列表返转的效果
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
>>> a[::-2]
[9, 7, 5, 3, 1]
排序&反转
排序
列表里都是数字类型,或者都是字符串类型可以使用sort()排序
>>> a = [83,4,2,4,6,19,33,21]
>>> a.sort()
>>> a
[2, 4, 4, 6, 19, 21, 33, 83]
下面的排序结果为何如何解释?
>>> names=['金角大王', 'rain', '@', '黑姑娘', '狗蛋', "4","#",'银角大王', 'eva']
>>> names.sort()
>>> names
['#', '4', '@', 'eva', 'rain', '狗蛋', '金角大王', '银角大王', '黑姑娘']
答案全在这张表上,虽然后面我们会讲,但现在先知道,排序的优化级规则是按这张表来的
反转
>>> names
['#', '4', '@', 'eva', 'rain', '狗蛋', '金角大王', '银角大王', '黑姑娘']
>>> names.reverse()
>>> names
['黑姑娘', '银角大王', '金角大王', '狗蛋', 'rain', 'eva', '@', '4', '#']
练习
针对列表names=[‘金角大王’, ‘黑姑娘’, ‘rain’, ‘eva’, ‘狗蛋’, ‘银角大王’, ‘eva’,’鸡头’]进入以下操作
1.通过names.index()的方法返回第2个eva的索引值
2.把以上的列表通过切片的形式实现反转
3.打印列表中所有下标为奇数的值
4.通过names.index()方法找到第2个eva值 ,并将其改成EVA
列表的官方帮助文档
1 Help on list object: 2 3 class list(object) 4 | list(iterable=(), /) 5 | 6 | Built-in mutable sequence. 7 | 8 | If no argument is given, the constructor creates a new empty list. 9 | The argument must be an iterable if specified. 10 | 11 | Methods defined here: 12 | 13 | __add__(self, value, /) 14 | Return self+value. 15 | 16 | __contains__(self, key, /) 17 | Return key in self. 18 | 19 | __delitem__(self, key, /) 20 | Delete self[key]. 21 | 22 | __eq__(self, value, /) 23 | Return self==value. 24 | 25 | __ge__(self, value, /) 26 | Return self>=value. 27 | 28 | __getattribute__(self, name, /) 29 | Return getattr(self, name). 30 | 31 | __getitem__(...) 32 | x.__getitem__(y) <==> x[y] 33 | 34 | __gt__(self, value, /) 35 | Return self>value. 36 | 37 | __iadd__(self, value, /) 38 | Implement self+=value. 39 | 40 | __imul__(self, value, /) 41 | Implement self*=value. 42 | 43 | __init__(self, /, *args, **kwargs) 44 | Initialize self. See help(type(self)) for accurate signature. 45 | 46 | __iter__(self, /) 47 | Implement iter(self). 48 | 49 | __le__(self, value, /) 50 | Return self<=value. 51 | 52 | __len__(self, /) 53 | Return len(self). 54 | 55 | __lt__(self, value, /) 56 | Return self<value. 57 | 58 | __mul__(self, value, /) 59 | Return self*value. 60 | 61 | __ne__(self, value, /) 62 | Return self!=value. 63 | 64 | __repr__(self, /) 65 | Return repr(self). 66 | 67 | __reversed__(self, /) 68 | Return a reverse iterator over the list. 69 | 70 | __rmul__(self, value, /) 71 | Return value*self. 72 | 73 | __setitem__(self, key, value, /) 74 | Set self[key] to value. 75 | 76 | __sizeof__(self, /) 77 | Return the size of the list in memory, in bytes. 78 | 79 | append(self, object, /) 80 | Append object to the end of the list. 81 | 82 | clear(self, /) 83 | Remove all items from list. 84 | 85 | copy(self, /) 86 | Return a shallow copy of the list. 87 | 88 | count(self, value, /) 89 | Return number of occurrences of value. 90 | 91 | extend(self, iterable, /) 92 | Extend list by appending elements from the iterable. 93 | 94 | index(self, value, start=0, stop=9223372036854775807, /) 95 | Return first index of value. 96 | 97 | Raises ValueError if the value is not present. 98 | 99 | insert(self, index, object, /) 100 | Insert object before index. 101 | 102 | pop(self, index=-1, /) 103 | Remove and return item at index (default last). 104 | 105 | Raises IndexError if list is empty or index is out of range. 106 | 107 | remove(self, value, /) 108 | Remove first occurrence of value. 109 | 110 | Raises ValueError if the value is not present. 111 | 112 | reverse(self, /) 113 | Reverse *IN PLACE*. 114 | 115 | sort(self, /, *, key=None, reverse=False) 116 | Stable sort *IN PLACE*. 117 | 118 | ---------------------------------------------------------------------- 119 | Static methods defined here: 120 | 121 | __new__(*args, **kwargs) from builtins.type 122 | Create and return a new object. See help(type) for accurate signature. 123 | 124 | ---------------------------------------------------------------------- 125 | Data and other attributes defined here: 126 | 127 | __hash__ = None
1 """ 2 针对列表names=[‘金角大王’, ‘黑姑娘’, ‘rain’, ‘eva’, ‘狗蛋’, ‘银角大王’, ‘eva’,’鸡头’]进入以下操作 3 4 5 通过names.index()的方法返回第2个eva的索引值 6 print(names.index("eva",names.index("eva")+1)) 7 把以上的列表通过切片的形式实现反转 8 print(a,names[::-1]) 9 打印列表中所有下标为奇数的值 10 count = 0 11 while count <= len(names)-1: 12 if count % 2 == 1: 13 print(count,names[count]) 14 count+=1 15 通过names.index()方法找到第2个eva值 ,并将其改成EVA 16 names[names.index("eva",names.index("eva")+1)]="EVA" 17 print(names) 18 19 """
元组
有些时候我们的列表数据不想被人修改时怎么办? 就可以用元组存放,元组又被称为只读列表,不能修改。
定义:与列表类似,只不过[]改成()
特性:
1.可存放多个值
2.不可变
3.按照从左到右的顺序定义元组元素,下标从0开始顺序访问,有序
创建
ages = (11, 22, 33, 44, 55)
#或
ages = tuple((11, 22, 33, 44, 55))
常用操作
#索引
>>> ages = (11, 22, 33, 44, 55)
>>> ages[0]
11
>>> ages[3]
44
>>> ages[-1]
55
#切片:同list
#循环
>>> for age in ages:
print(age)
11
22
33
44
55
#长度
>>> len(ages)
5
#包含
>>> 11 in ages
True
>>> 66 in ages
False
>>> 11 not in ages
False
注意:元组本身不可变,如果元组中还包含其他可变元素,这些可变元素可以改变
>>> data
(99, 88, 77, ['Alex', 'Jack'], 33)
>>> data[3][0] = '金角大王'
>>> data
(99, 88, 77, ['金角大王', 'Jack'], 33)
为啥呢? 因为元组只是存每个元素的内存地址,上面[‘金角大王’, ‘Jack’]这个列表本身的内存地址存在元组里确实不可变,但是这个列表包含的元素的内存地址是存在另外一块空间里的,是可变的。