列表
列表(list)是Python以及其他语言中最常用到的数据结构之一。Python使用使用中括号 [ ] 来解析列表。列表是可变的(mutable)——可以改变列表的内容。
列表是一组有序项目的集合 ,可变的数据类型【可进行增删改查】; 列表中可以包含任何数据类型,也可包含另一个列表【可任意组合嵌套】 列表是以方括号“”包围的数据集合,不同成员以“,”分隔 列表可通过序号访问其中成员.
1、创建列表
>>> names = ['lucky', 'jack', 'tom', 'jim', 'erica'] #方法一 >>> print(names)['lucky', 'jack', 'tom', 'jim', 'erica'] >>> names = list(('jason', 'chris', 'andy', 'sunny', 'sun')) #方法二 >>> print(names)['jason', 'chris', 'andy', 'sunny', 'sun']
2、访问元素
通过下标访问列表中的元素,下标从0开始计数
>>> jobs = ['PM', 'UI', 'UE', 'OPS', 'DBA', 'DEV'] >>> jobs[1] 'UI' >>> jobs[2] 'UE' >>> jobs[4] 'DBA' >>> jobs[-2] # 还可以倒数着来,不过下标从-1开始 'DBA'
3、列表切片
>>> jobs = ['PM', 'UI', 'UE', 'OPS', 'DBA', 'DEV'] >>> jobs[1:4] # 取下标从1到4的元素,但是不包括4,列表切片的特征就是左开右闭,也就是左取右弃。['UI', 'UE', 'OPS'] >>> jobs[1:-1] # 取下标为1到-1的元素,不包括-1,也就是最后一个元素不会被取出来。['UI', 'UE', 'OPS', 'DBA'] >>> jobs[:] # 这个在切片符左右没有下标限制,所以就是代表全取['PM', 'UI', 'UE', 'OPS', 'DBA', 'DEV'] >>> jobs[::] # 效果和上面一样,但是你会发现有两切片符,这是因为切片有一个步长的概念['PM', 'UI', 'UE', 'OPS', 'DBA', 'DEV'] >>> jobs[0:3] # 取下标0到3的元素,但不包括3['PM', 'UI', 'UE'] >>> jobs[:3] # 和上面效果一样['PM', 'UI', 'UE'] >>> jobs[3:] # 从下标3开始,到最后一个元素['OPS', 'DBA', 'DEV'] >>> jobs[3:-1] # 从下标3开始,到最后一个元素,但是不包括最后一个元素['OPS', 'DBA'] >>> jobs[0::2] # 从下标0开始,按照2个步长取值['PM', 'UE', 'DBA'] >>> jobs[::2] # 和上面效果一样['PM', 'UE', 'DBA']
利用下标取出的一个单独元素是str类型,而利用分片取出的是一个list类型。
4、列表追加
>>> jobs = ['PM', 'UI', 'UE', 'OPS', 'DBA', 'DEV'] >>> jobs.append('QA') #添加到最后 >>> jobs['PM', 'UI', 'UE', 'OPS', 'DBA', 'DEV', 'QA']
5、列表插入
>>> jobs = ['PM', 'UI', 'UE', 'OPS', 'DBA', 'DEV'] >>> jobs.insert(2, 'Sales') # 从下标为2的元素后面插入,其实可以理解为我插入一个元素,下标为3 >>> jobs['PM', 'UI', 'Sales', 'UE', 'OPS', 'DBA', 'DEV'] >>> jobs.insert(-1, 'QA') # 也可以倒数着来 >>> jobs['PM', 'UI', 'Sales', 'UE', 'OPS', 'DBA', 'QA', 'DEV']
6、修改元素
>>> jobs = ['PM', 'UI', 'UE', 'OPS', 'DBA', 'DEV'] >>> jobs[2] = 'QA' # 把下标为2的元素替换成QA,根据下标然后给元素重新赋值 >>> jobs['PM', 'UI', 'QA', 'OPS', 'DBA', 'DEV'] >>> jobs[-2] = 'Sales' # 把下标为12的元素替换成Sales,根据下标然后给元素重新赋值 >>> jobs['PM', 'UI', 'QA', 'OPS', 'Sales', 'DEV']
7、删除元素
>>> jobs = ['PM', 'UI', 'UE', 'OPS', 'DBA', 'DEV'] >>> del jobs[-1] # del方法删除最后一个元素 >>> jobs['PM', 'UI', 'UE', 'OPS', 'DBA'] >>> del jobs[1] # del方法删除下标为1的元素 >>> jobs['PM', 'UE', 'OPS', 'DBA'] >>> jobs.remove("DBA") # 根据remove方法,指定你想删除的元素 >>> jobs['PM', 'UE', 'OPS'] >>> jobs.pop() # pop方法,默认删除最后一个,返回删除元素 'OPS' >>> jobs['PM', 'UE'] >>> jobs.pop(0) # pop还可以指定元素下标,指定删除 'PM' >>> jobs['UE'] >>> jobs.clear() # clear 删除列表所有的元素,就是清空列表,变成为一个空列表 >>> jobs[]
remove方法删除一个元素,必须是在列表中的,否则会报错,del利用下标来删除元素,pop默认删除最后一个元素,也可以指定元素下标来删除。
8、扩展列表
>>> jobs = ['PM', 'UI', 'UE', 'OPS', 'DBA', 'DEV'] >>> job = ['Sales', 'QA', 'HR'] >>> jobs.extend(job) # extend方法就是把job列表里面的元素一个个添加到jobs列表中。 >>> jobs['PM', 'UI', 'UE', 'OPS', 'DBA', 'DEV', 'Sales', 'QA', 'HR']
9、列表拷贝
>>> jobs['PM', 'UI', 'UE', 'OPS', 'DBA', 'DEV'] >>> jobs_copy = jobs.copy() # 复制一份jobs列表 >>> jobs_copy['PM', 'UI', 'UE', 'OPS', 'DBA', 'DEV'] >>> jobs = ['PM', 'UI', 'UE', 'OPS', ['DBA', 'QA', 'DEV']] # 嵌入式列表 >>> jobs_copy2 = jobs.copy() >>> jobs_copy2['PM', 'UI', 'UE', 'OPS', ['DBA', 'QA', 'DEV']] >>> jobs[0] = 'HR' # 改变小标为0的元素 >>> jobs['HR', 'UI', 'UE', 'OPS', ['DBA', 'QA', 'DEV']] # 改变了 >>> jobs_copy2['PM', 'UI', 'UE', 'OPS', ['DBA', 'QA', 'DEV']] # 没变 >>> jobs[-1][0] = 'Sales' # 改变内嵌列表的下标为0的元素 >>> jobs['HR', 'UI', 'UE', 'OPS', ['Sales', 'QA', 'DEV']] # 改变了 >>> jobs_copy2['PM', 'UI', 'UE', 'OPS', ['Sales', 'QA', 'DEV']] # 改变了
从上面可以看出列表的copy方法是一个浅copy的栗子,只会拷贝第一次,而多层嵌入的话,会随着源列表的变化为变化,关于深拷贝和浅拷贝后面详细介绍。
10、列表统计
>>> jobs = ['PM', 'UI', 'OPS', 'UE', 'OPS', 'DBA', 'DEV'] >>> jobs.count('OPS') # 因为列表是有序的一种数据类型,所以它的元素是可以重叠的,所以有元素统计。 2
11、排序和翻转
>>> jobs = ['PM', 'UI', 'OPS', 'UE', 'OPS', 'DBA', 'DEV', 1, 2, 3] >>> jobs.sort() Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unorderable types: int() < str() # Python3.0里不同数据类型不能放在一起排序了,擦 >>> jobs[-1] = '3' >>> jobs[-2] = '2' >>> jobs[-3] = '1' >>> jobs['DBA', 'DEV', 'OPS', 'OPS', 'PM', 'UE', 'UI', '1', '2', '3'] >>> jobs.sort() >>> jobs['1', '2', '3', 'DBA', 'DEV', 'OPS', 'OPS', 'PM', 'UE', 'UI'] >>> jobs.append('#') >>> jobs.append('&') >>> jobs.sort() >>> jobs['#', '&', '1', '2', '3', 'DBA', 'DEV', 'OPS', 'OPS', 'PM', 'UE', 'UI'] # 可以看出排序的顺序 特殊字符->数字->字母 这么一个优先级 >>> jobs.reverse() # 翻转最后到最前面 >>> jobs['UI', 'UE', 'PM', 'OPS', 'OPS', 'DEV', 'DBA', '3', '2', '1', '&', '#']
sort()方法会修改原列表,而不是创建一个新的有序列表,reverse()也会修改原列表,但是你希望排序,但是又不希望修改原列表,你只能利用python中一个名为sorted()的内置函数来操作:
>>> jobs = ['UI', 'UE', 'PM', 'OPS', 'OPS', 'DEV', 'DBA', '3', '2', '1', '&', '#'] >>> newlist = sorted(jobs) >>> jobs['UI', 'UE', 'PM', 'OPS', 'OPS', 'DEV', 'DBA', '3', '2', '1', '&', '#'] >>> newlist['#', '&', '1', '2', '3', 'DBA', 'DEV', 'OPS', 'OPS', 'PM', 'UE', 'UI']
12、列表索引
>>> jobs = ['PM', 'UI', 'OPS', 'UE', 'OPS', 'DBA', 'DEV', 'UE'] >>> jobs.index('OPS') 2 >>> jobs.index('UE') 3 >>> jobs.index('xx') Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: 'xx' is not in list >>> if 'OPS' in jobs: ... print(jobs.index('OPS')) ... 2
索引下标,只会返回第一个元素的下标,如果元素不在列表中,会报错,我们可以利用in这个关键之来判断元素是否在列表中。
列表所有的方法如下:
class list(object): """ list() -> new empty list list(iterable) -> new list initialized from iterable's items """ def append(self, p_object): # real signature unknown; restored from __doc__ """ L.append(object) -> None -- append object to end """ pass def clear(self): # real signature unknown; restored from __doc__ """ L.clear() -> None -- remove all items from L """ pass def copy(self): # real signature unknown; restored from __doc__ """ L.copy() -> list -- a shallow copy of L """ return [] def count(self, value): # real signature unknown; restored from __doc__ """ L.count(value) -> integer -- return number of occurrences of value """ return 0 def extend(self, iterable): # real signature unknown; restored from __doc__ """ L.extend(iterable) -> None -- extend list by appending elements from the iterable """ pass def index(self, value, start=None, stop=None): # real signature unknown; restored from __doc__ """ L.index(value, [start, [stop]]) -> integer -- return first index of value. Raises ValueError if the value is not present. """ return 0 def insert(self, index, p_object): # real signature unknown; restored from __doc__ """ L.insert(index, object) -- insert object before index """ pass def pop(self, index=None): # real signature unknown; restored from __doc__ """ L.pop([index]) -> item -- remove and return item at index (default last). Raises IndexError if list is empty or index is out of range. """ pass def remove(self, value): # real signature unknown; restored from __doc__ """ L.remove(value) -> None -- remove first occurrence of value. Raises ValueError if the value is not present. """ pass def reverse(self): # real signature unknown; restored from __doc__ """ L.reverse() -- reverse *IN PLACE* """ pass def sort(self, key=None, reverse=False): # real signature unknown; restored from __doc__ """ L.sort(key=None, reverse=False) -> None -- stable sort *IN PLACE* """ pass
13、列表的遍历
在Python中常用循环对象来遍历列表,在这里for循环自动调用next()方法,将该方法的返回值赋予给循环对象i。循环检测到StopIteration的时候才结束。相对于序列,用循环对象的好处在于:不用在循环还没有开始的时候,就生成好要使用的元素。所使用的元素可以在循环过程中逐次生成。这样,节省了空间,提高了效率,编程更灵活。
#!/usr/bin/env python3 # _*_coding:utf-8_*_ # Author: Lucky.chen jobs = ['UI', 'UE', 'PM', 'OPS', 'OPS', 'DEV', 'DBA', '3', '2', '1', '&', '#'] for i in jobs: print(i) # 自动调用迭代器,自动检测StopIteration # 在上面的程序中,无法知道当前访问元素的索引,于是有如下代码: for i in range(len(jobs)): print(jobs[i]) # 同时需要索引,又结合迭代器,就可以采用内置的enumerate函数,代码如下: for index, i in enumerate(jobs): print(index, i)
扩展:(表推导方法)
表推导(list comprehension)是快速生成列表的方法。它的语法简单,很有实用价值。
L = [x**2 for x in range(10)] print(L) Result:[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
zip函数
如果你多个等长的序列,然后想要每次循环时从各个序列分别取出一个元素,可以利用zip()方便地实现:
t1 = [1, 2, 3] t2 = [9, 8, 7] t3 = ['a', 'b', 'c'] for (a, b, c) in zip(t1, t2, t3): print(a, b, c) Result: 1 9 a 2 8 b 3 7 c
每次循环时,从各个序列分别从左到右取出一个元素,合并成一个tuple,然后tuple的元素赋予给a,b,c
#!/usr/bin/env python3 # _*_coding:utf-8_*_ # Author: Lucky.chen ShopName = ['iphone', 'MacPro', 'iWatch'] money = [5500, 12000, 3800] Car = [] for it in zip(ShopName, money): Car.append(it) print(Car) Result:[('iphone', 5500), ('MacPro', 12000), ('iWatch', 3800)]