Python数组类型——列表(list)
列表是最常用的Python数据类型,可以作为一个方括号内的逗号分隔值出现。
列表的数据项不需要具有相同的类型,列表索引从0开始。
创建一个列表,只要把逗号分隔的不同的数据项使用方括号括起来即可。如下所示:
list0 = []
list1 = ['physics', 'chemistry', 1997, 2000]
list2 = [1, 2, 3, 4, 5 ]
list3 = ["a", "b", "c", "d"]
1、可以使用append()方法来添加列表项
list = [] ## 空列表
list.append('Google') ## 使用 append() 添加元素
list.append('Runoob')
print list
结果:
['Google', 'Runoob']
2、删除列表元素
①使用 del 语句来删除列表的元素:
list1 = ['physics', 'chemistry', 1997, 2000]
print list1
del list1[2]
print "After deleting value at index 2 : "
print list1
结果:
['physics', 'chemistry', 1997, 2000]
After deleting value at index 2 :
['physics', 'chemistry', 2000]
②pop方法,删除并返回指定位置的元素,如果位置超出list范围会发生运行时错误:
numList = [8, 9, 6, 5, 7, 2]
print(numList.pop(0))
# 8
print(numList)
# [9, 6, 5, 7, 2]
③remove方法,直接删除list中第一个和参数值相等的元素,没有返回值。如果list中不存在要删除的元素,会导致运行时错误:
numList = [8, 6, 5, 7, 2]
print(numList.remove(2))
print(numList)
# [8, 6, 5, 7]
3、Python列表脚本操作符
4、Python列表截取
5、Python列表函数&方法
函数:
方法:
6、合并List
①直接把要合并的list对象相加——mixList + numList
②直接修改对象本身,在尾部追加一个list——mixList.extend(numList)
7、列表解析
列表解析提供了一种生成列表方法,简洁,而不损失任何可读性,性能还快很多很多。
①示例
例子——如果我们需要0~100所有偶数组成的列表,正常的代码应该是这样的:
a=[]
for i in range(101):
if i%2==0:
a.append(i)
用列表解析:
a=[x for x in range(101) if x%2==0]
x:需要的列表里的结果
for x in range(101):x——0~100的数字
if x%2==0:x成立的条件,如果不成立就不放在列表结果里
例2,获取文本中所有单词的第1个字符
正常的代码
text="My house is full of flowers"
first_charts=[]
for word in text.split():
first_charts.append(word[0])
列表解析的代码:
first_charts=[word[0] for word in text.split()]
列表解析的第一部分可以是任意一个表达式
例3,获取两个列表对应位的乘积
list a=[2,3,4,5]; list b=[3,4,5,6],想要得到a,b对应位的乘积:
[i*j for i,j in zip(a,b)]
除了列表解析,还需要使用zip函数来帮忙,zip将a,b对应位打包起来,返回[[2,3][3,4][4,5][5,6]]
例4,带if else的列表解析
list a=[‘1’,‘2’,‘3’,‘i’,‘8’],现在想将a中所有能转化为数字的字符串转化为数字,不为数字的内容都转换成0,用列表解析可以这样写:
[int(i) if i.isdigit() else 0 for i in a]
out>>[1,2,3,0,8]
如果list a=[‘1’,‘2’,‘3’,4,5,‘o’,‘6’],如果不能转换成数字则为None,列表解析可以这样写:
[int(i) if str(i).isdigit() else None for i in a]
out>>[1, 2, 3, 4, 5, None, 6]
从这个例子可以看到,可以嵌套若干if else的语句在表达式里面。
例5,获取一个全X列表
['ok' for i in range(10)]
得到一个长度为10的,全’ok’字符组成的列表
例6,获取列表中嵌套列表的元素,生成一个无嵌套的新列表
从[[1,2],[3,4,5],[6,7],[8]]这种列表中,把嵌套在列表中的元素解出来,得到[1,2,3,4,5,6,7,8],用列表解析可以这样写:
a=[[1,2],[3,4,5],[6,7],[8]]
[x for i in a for x in i]
out>>[1,2,3,4,5,6,7,8]
for i in a,i为子列表,for x in i,x得到每个子列表中的值。
例7,获取笛卡尔积
假设有三个列表
>>> a=['4k','8k','12k']
>>> b=['1','2,','3']
>>> c=['libaio','bio','directio']
想获取其笛卡尔积,列表解析的写法:
[{'blocksize':x,'numjobs':y,'ioengine':z} for x in a for y in b for z in c]
得到一个包含所有参数项目的字典列表,避免了写若干个for循环。
例8,获取所有可能的组合
假设有一个配置列表[‘a’,‘b’,‘c’],我们想获取所有的由a,b,c组成的字符串(可以重复使用,将顺序也考虑在内),列表解析需要配合itertools中的product函数:
from itertools import product
x=['a','b','c']
results = ["".join(i) for i in product(x, repeat=3)]
out>>['aaa', 'aab', 'aac', 'aba', 'abb', 'abc', 'aca', 'acb', 'acc', 'baa', 'bab', 'bac', 'bba', 'bbb', 'bbc', 'bca', 'bcb', 'bc
c', 'caa', 'cab', 'cac', 'cba', 'cbb', 'cbc', 'cca', 'ccb', 'ccc']
例9,矩阵转置
矩阵matrix=[[1, 2, 3, 4], [2, 4, 6, 8], [3, 6, 9, 12]],要获得他的转置矩阵,用列表解析仍然是一行:
transposed = [list(row) for row in zip(*matrix)]
matrix使用zip解开(完成转置),列表解析负责将结果生成原来的列表嵌套列表的模式
注——也可以不用列表解析:
transposed = list(map(list, zip(*matrix)))
使用map函数也是可以的(顺便提一下)
②优点
相比于for循环,列表解析的语法是由底层c语言实现的,和使用for循环遍历pyobject对象相比,性能会有很大的提升,定义两个函数:
def l1_true(L):
a=[x*x for x in L]
return
def l1_false(L):
a=[]
for i in L:
a.append(i*i)
return
L为range(10000),将这两个函数循环执行10000次,计算平均耗时得到:
l1_true:0.0007s
l1_false:0.0014s
从耗时来看,使用列表解析后生成同样列表,耗时是使用for循环的二分之一
使用例6的列表解析来对比
def l2_true(L):
result=[x for i in L for x in i]
return
def l2_false(L):
a=[]
for i in L:
for x in i:
a.append(x)
L=[[i,i+1] for i in range(10000)],循环执行10000次对比结果为:
l2_true:0.0015
l2_false:0.0033
由上面两个例子可以看出,列表解析的将会大大提高python代码的执行效率。
8、list中的中文转换编码显示
转换前输出:
先str转为字符串之后decode解码:
for i in range(1,sheet.nrows):
row=sheet.row_values(i,0,sheet.ncols)
row=str(row).replace('u\'','\'').decode("unicode-escape")
print row
转换后输出结果如下: