python3基础梳理02数据结构之列表(list)和元组(tuple)
本文主要梳理python序列容器中的列表和元组数据结构的基础知识.。
目录
先简单说一下python容器和变量两个概念。
python容器
容器(container)是python支持的一种数据结构基本概念,是可包含其他对象的对象(python中一切皆为对象,例如,我正在写的博文,使用的python,键盘等);容器都包含了一个__contains__ 方法(dir函数可查看);三种主要的python容器:
- 序列,如列表,元组和字符串,在序列中,每个元素都有编号;
- 映射,如字典,在映射中,每个元素都有名称,也叫键;
- 集合(set)。
python变量(variable)
表示(或指向)特定值的名称;变量名称只能由字母、数字和下划线(_)构成,开头不能为数字;变量赋值及使用,如下。
In [2]: x=3#变量x赋值
In [3]: print(x)#表达式中使用变量
3
列表(list)
-
列表特点
- 使用中括号包围;
- 列表中可以存放任意类型和任意个数的元素(字符串,数字,列表,字典等等);
- 列表是一种序列容器,具有序列序列通用的方法和函数。
-
列表创建
In [5]: ["a","b","c",1]#使用[]创建
Out[5]: ['a', 'b', 'c', 1]
IIn [7]: list("124")#使用list函数创建
Out[7]: ['1', '2', '4']
In [8]: [i for i in "Hello" ]#列表推导式创建
Out[8]: ['H', 'e', 'l', 'l', 'o']
-
列表操作
相加(+),相乘(*),
相加(+)
In [9]: ['1', '2', '4'] + ['H', 'e', 'l', 'l', 'o']
Out[9]: ['1', '2', '4', 'H', 'e', 'l', 'l', 'o']
相乘(*)
In [11]: ['1', '2', '4'] * 2
Out[11]: ['1', '2', '4', '1', '2', '4']
索引(index)
In [13]: alist = ['1', '2', '4', ['a', 'b']]
In [14]: alist
Out[14]: ['1', '2', '4', ['a', 'b']]
In [15]: alist[0]
Out[15]: '1'
In [16]: alist[-1]
Out[16]: ['a', 'b']
In [17]: alist[-1][0]#嵌套列表索引
Out[17]: 'a'
切片
类似上一节字符串切片操作,略。
列表元素修改
列表中元素可修改,可通过索引或者切片修改。
In [18]: alist[-1] = ['c', 'a']#索引修改
In [19]: alist
Out[19]: ['1', '2', '4', ['c', 'a']]
In [31]: alist[1:3] = []#切片修改
In [32]: alist
Out[32]: ['1', ['c', 'a']]
成员资格
判断某个元素是否存在列表中,存在返回True,否则返回False。
In [210]: a
Out[210]: ['a111', 'a1', 'a']
In [211]: "a" in a
Out[211]: True
In [212]: "a2" in a
Out[212]: False
列表推导式
此处简要介绍,后续详细介绍。
In [210]: a
Out[210]: ['a111', 'a1', 'a']
In [213]: [i[0] for i in a]
Out[213]: ['a', 'a', 'a']
列表方法
dir函数列出列表所有函数和方法,红色为函数,蓝色为方法。
In [36]: print(dir(list))
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
append
列表末尾添加一个元素。
In [2]: alist = ['1', '2', '4', ['c', 'a']]
In [3]: alist.append("hah")
In [4]: alist
Out[4]: ['1', '2', '4', ['c', 'a'], 'hah']
clear
将列表中元素清空。
In [4]: alist
Out[4]: ['1', '2', '4', ['c', 'a'], 'hah']
In [6]: alist.clear()
In [7]: alist
Out[7]: []
copy
复制列表,得到一个副本,等价于list[:],list(list)。
In [130]: a = [1,2,3]
In [131]: b = a.copy()
In [132]: b
Out[132]: [1, 2, 3]
In [133]: b[0] = "hah"#修改b列表
In [134]: b
Out[134]: ['hah', 2, 3]
In [135]: a#b列表修改不会影响a列表
Out[135]: [1, 2, 3]
count
计算某个元素在列表中出现了多少次。
In [138]: a
Out[138]: [1, 2, 3]
In [139]: a.count(1)#1在a中出现1次
Out[139]: 1
In [140]: a.count(4)#4不在a中返回0次
Out[140]: 0
extend
使用一个列表扩展另外一个列表,此处要区别于前面提到的列表相加(效率和可读性不及extend)。
#列表相加
In [145]: a = [1, 2, 3]
In [146]: a + b
Out[146]: [1, 2, 3, 4, 5, 6]
In [147]: a#列表相加未修改a列表
Out[147]: [1, 2, 3]
#extend
In [141]: a
Out[141]: [1, 2, 3]
In [142]: b = [4, 5, 6]
In [143]: a.extend(b)
In [144]: a#extend修改了a列表
Out[144]: [1, 2, 3, 4, 5, 6]
index
查找某个元素第一次出现在列表中的索引号。
In [150]: a = [1, 2, 3, 3]
In [151]: a.index(1)
Out[151]: 0
In [152]: a.index(3)#返回3第一次出现的索引2
Out[152]: 2
inseret
在列表指定位置添加某个新元素,此处要区别于上文的切片或者索引修改列表的方法(方法效率和可读性不及insert)。
#切片或者索引修改法
In [160]: a = [1, 2, 3, 3]
In [161]: a[1:1] = ["haha"]
In [162]: a
Out[162]: [1, 'haha', 2, 3, 3]#insert方法
In [153]: a
Out[153]: [1, 2, 3, 3]
In [154]: a.insert(1, "haha")
In [155]: a
Out[155]: [1, 'haha', 2, 3, 3]
pop
从列表中删除一个元素,默认删除最后一个元素,可指定索引号删除对应元素,并返回这一元素。
pop是唯一既修改列表又返回一个非None值的列表方法。
In [163]: a
Out[163]: [1, 'haha', 2, 3, 3]
In [164]: a.pop()
Out[164]: 3
In [165]: a
Out[165]: [1, 'haha', 2, 3]
In [167]: a.pop(1)#删除索引为1的元素,并返回
Out[167]: 'haha'
In [168]: a
Out[168]: [1, 2, 3]
remove
删除列表中第一次出现的元素。
In [170]: a = [1, 2, 3, 3]
In [171]: a.remove(3)
In [172]: a
Out[172]: [1, 2, 3]
In [173]: a.remove(4)#元素不存在是,报错并退出执行
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-173-181f025cbb19> in <module>
----> 1 a.remove(4)
ValueError: list.remove(x): x not in list
reverse
将列表中元素顺序颠倒。
In [183]: a
Out[183]: [2, 1]
In [184]: a.reverse()
In [185]: a
Out[185]: [1, 2]
reversed函数
该函数可以达到reverse相同的目的。
In [186]: reversed(a)#返回一个迭代器
Out[186]: <list_reverseiterator at 0x601cdd8>
In [187]: list(reversed(a))
Out[187]: [2, 1]
sort
对列表就地排序(默认低到高排序,即升序),而不是返回排序后的列表的副本。
In [191]: a = [1, 3, 5, 3, 0]
In [192]: a.sort()
In [193]: a#就地修改了
Out[193]: [0, 1, 3, 3, 5]
In [194]: b = a.sort()#不是返回排序后的a列表的副本,所以b为None
In [195]: b
#sort的key和reverse参数
#key后的函数自己可以自定义,即自己可以设定排序规则。key默认为None。
In [204]: a = ["a111", "a1", "a"]
In [207]: a.sort(key=len, reverse=True)#len按元素长度排序,reverse=True指定按从大到小排序
In [208]: a
Out[208]: ['a111', 'a1', 'a']
sorted函数
返回被列表排序后的一个副本,默认从低到高排序,要区别于sort方法。
In [199]: a = [1, 3, 5, 3, 0]
In [200]: b = sorted(a)
In [201]: b
Out[201]: [0, 1, 3, 3, 5]
In [202]: a
Out[202]: [1, 3, 5, 3, 0]
元组(tuple)
-
元组特点
- 使用小括号()包围;
- 元组和列表一样也是序列容器,具有序列的通用操作;
- 元组和列表最大的区别是不可修改(和前面介绍的字符串一样不能修改),所以元组不具有列表的大量方法。
-
元组创建
In [225]: (1, 2, 3, 4)#小括号()包围一串数字
Out[225]: (1, 2, 3, 4)
In [227]: tuple([1, 2, 3, 4])#使用tuple函数
Out[227]: (1, 2, 3, 4)
In [228]: tuple("1234")
Out[228]: ('1', '2', '3', '4')
-
元组操作
- 不能修改元组;
- 可以切片,索引,相加等操作元组,可参考列表操作。
-
元组方法
由于元组不可修改,元组方法和列表有很大区别,如下。有count和index方法,用法类似列表中方法。
In [222]: print(dir(list))#列表的内置函数和方法
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
In [219]: print(dir(tuple))#元组的内置函数和方法
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'count', 'index']
我的公众号
力求详细专业介绍生信,python等语言相关技术,欢迎一起学习!