python 数据结构 - 列表
Python中列表是可变的,这是它区别于字符串和元组的最重要的特点,一句话概括即:列表的元素可以修改,而字符串和元组不能(元祖元素的元素可以修改)。
列表类似c语言中的数组,但是python中的列表可以同时存放不同类型数据。eg: a = ['m', 1, ['b', 5], 2.0, ('c', 2), {'name': 'admin'}]
列表常见方法有:
1 #!/usr/bin/env python 2 #coding:utf-8 3 4 #列表 5 lis = [] 6 '''等效 lis = list() 列表是有序的,可以索引''' 7 8 lis.append(self, object) 9 ''' 把一个元素添加到列表的结尾,相当于lis[len(lis):] = [object] ''' 10 lis.extend(self, iterable) 11 '''iterable(可迭代的,迭代器)。通过添加指定列表的所有元素来扩充列表,相当于 lis[len(lis):] = iterable''' 12 lis.insert(index, object) 13 '''在指定位置插入一个元素,index是要插入位置的索引,object是要插入的元素''' 14 lis.remove(x) 15 '''从列表中删除值为x的第一个元素,若没有,则返回一个错误''' 16 lis.pop(index=None) 17 '''从列表中删除index指定的索引的值,并将其返回。若没有指定索引,默认删除最后一个元素,并将其返回''' 18 lis.clear() 19 '''移除列表中的所有项,等同于 del lis[:] ''' 20 lis.index( x, start=None, stop=None) 21 '''返回列表中第一个值为 x 的元素的索引,不存在就返回错误. 可指定开始点和结束点的索引,范围前开后闭''' 22 lis.count(x) 23 '''返回 x 在列表中出现的次数''' 24 lis.sort(key=None, reverse=False) 25 '''对列表中的元素进行排序,默认从小到大,不能比较不同类型数据,key指定以...排序,reverse=True 表示逆序(从大到小)''' 26 lis.reverse() 27 '''倒序列表中的元素,不管数据类型,不排序,只是把整个列表倒置''' 28 lis.copy() 29 '''返回列表的浅复制,等于lis[:] '''
注:除 index()、count()、clear()、copy() 外,其余的方法都是对列表本身进行修改,操作过后,列表会改变。
计算列表长度:
1 >>> a = ['m', 3, ['b', 5], 2.0, ('c', 2), {'name': 'admin'},6,] 2 >>> len(a) 3 7 4 >>>
切片:
列表切片前后原列表不变,切出来的分片是重新开辟一块内存的列表。
切片时,范围前开后闭
1 >>> a = ['m', 3, ['b', 5], 2.0, ('c', 2), {'name': 'admin'},6,] 2 >>> a 3 ['m', 3, ['b', 5], 2.0, ('c', 2), {'name': 'admin'}, 6] 4 >>> b = a[1:6] 5 >>> b 6 [3, ['b', 5], 2.0, ('c', 2), {'name': 'admin'}] 7 >>> c = a[2:] 8 >>> c 9 [['b', 5], 2.0, ('c', 2), {'name': 'admin'}, 6] 10 >>>
列表的比较:(对应索引的元素一一对应比较)
从第一个元素开始比较(索引为0),只要有一个元素大,后面就不用再比较。类似字符串的比较,但字符串比较多是Asscii码
1 >>> a = [2,5,'c','m',8] 2 >>> b = [2,5,'c','n',6] 3 >>> a > b 4 False 5 >>> a < b 6 True 7 >>>
判断元素是否在列表内: in 、not in
>>> a = ['m', 3, ['b', 5], 2.0, ('c', 2), {'name': 'admin'},6,] >>> 'm' in a True >>> 999 in a False >>>
列表赋值与拷贝:
赋值,a,b是指向的同一片内存,修改a(or b),那么b(or a)也会改变。
分片拷贝:在内存中复制a一次,代码执行后c就复制完成,a,c 彼此独立存在于内存中,修改a(or c),那么c(or a)不会改变
1 >>> a = ['m', 3, ['b', 5], 2.0, ('c', 2), {'name': 'admin'}, 6] 2 >>> b = a 3 >>> id(a) 4 2266953240072 5 >>> id(b) 6 2266953240072 7 >>> c = a[:] 8 >>> id(c) 9 2266953239496 10 >>> a.remove(2.0) 11 >>> a 12 ['m', 3, ['b', 5], ('c', 2), {'name': 'admin'}, 6] 13 >>> b 14 ['m', 3, ['b', 5], ('c', 2), {'name': 'admin'}, 6] 15 >>> c 16 ['m', 3, ['b', 5], 2.0, ('c', 2), {'name': 'admin'}, 6] 17 >>>
列表推导式
格式: [ 表达式 for x in 迭代器]、[表达式 for x in 迭代器 if 条件]、[表达式 for x in 迭代器 for y in 迭代器]...
注:表达式可以是变量、常数、字符串、列表、元祖、字典...
迭代字符串
1 >>> s = 'abcde' 2 >>> [x for x in s] #这里可以是[123 for x in s],然后就是[123,123,123,123,123],说这个的目的是要明白这里相当于把前面的表达式(x)循环几遍,然后都加入到列表中 3 ['a', 'b', 'c', 'd', 'e'] 4 >>>
迭代字典
>>> dic = {'name': 'root', 'age': 20, 'gender': 'man'} >>> [['%s : %s' %(k,v)] for k,v in dic.items()] [['name : root'], ['age : 20'], ['gender : man']] >>>
注意:在迭代时进行类型转换为字典时,若有相同键名,新值会覆盖旧值 eg:
1 >>> [(x,y) for x in ('m','n',) for y in range(2)] 2 [('m', 0), ('m', 1), ('n', 0), ('n', 1)] 3 >>> dict([(x,y) for x in ('m','n',) for y in range(2)]) 4 {'m': 1, 'n': 1} 5 >>>
知识增长中 待补充。。。