list是可变序列,通常用于存储同类型的元素。下面介绍list的专用方法,并且介绍几种使用list的数据结构。
构造list
list可以使用下面几种方法构造: 1)用一对方括号表示一个空list:[]; 2)用方括号,元素使用逗号分隔:[a],[a,b,c]; 3)用表达式:[x for x in iterable]; 4)使用list函数:list()或者list(iterable)。这里list函数用于构造一个list。如果参数为空,则创建一个空的list。iterable可以是一个序列、支持迭代的容器或者迭代对象,如果iterable已经是一个list,则返回该list的拷贝,,类似于iterable[:]。下面是具体的例子:
>>> list(‘abc’)[‘a’, ‘b’, ‘c’]>>> list((1,2,3))[1, 2, 3]
除了上面介绍的方法,还有一些方法也产生list,例如sorted() 方法。
list的方法
list实现了所有序列的公共方法和可变序列的方法,另外,list还提供了排序方法。
sort
sort用于对list进行原位排序,即会改变原来的list,让其中的元素按一定的顺序排列,例如:
>>> s = [7,2,4,1,6,9,8]>>> s.sort()>>> s[1, 2, 4, 6, 7, 8, 9]
sort不会返回值,如果你不想改变原list,则需要先将数据进行一次拷贝:
>>> s = [7,2,4,1,6,9,8]>>> other = s[:]>>> other.sort()>>> s[7, 2, 4, 1, 6, 9, 8]>>> other[1, 2, 4, 6, 7, 8, 9]
或者你可以使用sorted函数,它返回新的原list的排序后的list:
>>> s = [7,2,4,1,6,9,8]>>> other = sorted(s)>>> s[7, 2, 4, 1, 6, 9, 8]>>> other[1, 2, 4, 6, 7, 8, 9]
高级排序
sort默认按升序排列元素,如果按照特定的方式排序,则需要指定参数,sort支持的参数如下: sort(*,key=None,reverse=None)key指定排序的key,reverse指定执行是否逆序。看下面的例子:
>>> x = [‘kjkeikkkll’, ’34r5fd’,’1qw’,’12333333333333333′,’kiooo’]>>> x.sort(key=len)>>> x[‘1qw’, ‘kiooo’, ’34r5fd’, ‘kjkeikkkll’, ‘12333333333333333’]>>> s = [7,2,4,1,6,9,8]>>> s.sort(reverse=True)>>> s[9, 8, 7, 6, 4, 2, 1]
在2.x的python版本还可以指定cmp,表示比较函数,不过使用key也能代替cmp,如定义一个key函数:
def toValue(x): return x[‘age’]
然后在排序中使用该函数:
persons=[{‘name’:’ZhangSan’,’age’:16},{‘name’:’LiSi’,’age’:12}]persons.sort(key=toValue)print(persons)
也可以使用lambda表达式来做:
>>> persons=[{‘name’:’ZhangSan’,’age’:16},{‘name’:’LiSi’,’age’:12}]>>> persons.sort(key=lambda a : a[‘age’])>>> persons[{‘age’: 12, ‘name’: ‘LiSi’}, {‘age’: 16, ‘name’: ‘ZhangSan’}]
list推导
假定我们需要构造一个list,如下:
>>> s = []>>> for x in range(10): s.append(x**2)>>> s[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
我们能用更简洁的方式来做这个事情:
>>>list(map(lambda x:x**2,range(10)))[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
map(function,iterable,…)的作用是生成一个迭代器,使用function到每一个条目。或者,也可以使用下面的方式:
>>> [x**2 for x in range(10)][0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
这样更简洁,可读性也更好。也可以用在多元的列表上:
>>> [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y][(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
或者为单个元素使用多个for:
>>> vec = [[1,2,3], [4,5,6], [7,8,9]]>>> [num for elem in vec for num in elem][1, 2, 3, 4, 5, 6, 7, 8, 9]
嵌套list推导
假定我们存在下面的一个3*4的矩阵:
>>> matrix = [[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12]]
可以使用该矩阵生成一个嵌套list:
>>> [[row[i] for row in matrix] for i in range(4)][[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
也就是取matrix中每行的第i个元素组成一个新的list,并将该list作为嵌套list的第i个元素。
击败不等于击倒,跌倒了,爬起来,想一想,为什么跌倒了,