Python学习(4):列表

Python学习

1. 列表:打了激素的数组与其他编程语言中的数组不同,python中的列表可以包含不同的数据类型

创建普通列表(同种数据类型):

member=['a','b','c','d','e','f','g']
number=[1,2,3,4,5]创建混合列表(不同数据类型):
mix=[1,'abc',3.141592653,[1,2,3]]创建空列表:
empty=[]向列表添加元素:
#append将指定元素添加到指定列表末尾。append只接受一个参数
member.append('hijk')
#extend可以同时添加多个元素,但是它们需要组成一个列表
member.extend(['l','m','n'])
#insert可以在列表中指定位置添加元素。接受两个参数,第一个参数是插入的位置索引,第二个参数是插入的元素
member.insert(0,'xyz')与数组一样,我们可以通过元素的索引值(index)从列表中获取单个元素
member[0]
#得到结果:'xyz'从列表中删除元素:
member
#结果:['xyz','a','b','c','d','e','f','g','hijk','l','m','n']
#remove方法删除指定元素,接受参数为指定元素的内容
member.remove('hijk')
mix.remove([1,2,3])
#del语句,删除指定内容
delmember[0]#删除'xyz'
delnumber#删除整个number列表
#pop方法,从列表末尾删除指定元素并返回其内容
member.pop()#删除了'n'并将其返回
#pop方法还可以接受一个参数,该参数是列表的索引值
member.pop(1)#删除了'b'并将其返回列表分片/切片(Slice):一次性获取多个元素
member
#结果:['a','c','d','e','f','g','l','m']
member[1:3]
#得到结果:['c','d']。列表切片list[a:b]返回的是从索引a开始到索引b-1为止的元素列表。原列表并没有改变,返回的是新的列表
member[1:1]
#得到结果:[]。当b<=a时,返回空列表
member[:3]
#得到结果:['a','c','d']
member[1:]
#得到结果:['c','d','e','f','g','l','m']
member[:]
#得到结果:['a','c','d','e','f','g','l','m']
#以上三种简写很有用处。第三种得到的是原列表的复制

2. 列表的常用操作符比较操作符

list1=[123,456]
lsit2=[234,123]
list1>list2
#得到结果:False
#列表的比较从第一个元素开始,一旦有结果立即返回
list3=[123,456]
(list1
#得到结果:True列表的拼接:
list4=list1+list2
#list4的值为:[123, 456, 234, 123]
#注意:虽然看起来+可以实现extend的功能,但是有很多限制,+两边的类型必须一致,list1 + 'abc'或者list1 + 123这样的情况会报错。要扩展列表还是使用extend更为明确
list3*=3
#list3的值变为:[123,456,123,456,123,456]成员关系操作符
123inlist3
#返回:True
'abc'inlist3
#返回:False
'abc'notinlist3
#返回:True
123notinlist3
#返回:False
test=[123,['abc','def'],456]
'abc'intest
#返回:False
'abc'intest[1]
#返回:True
#in和not in只影响一层关系,如果要判断数组中的数组,需要加上索引列表类型的内置函数:
list3
#值为:[123, 456, 123, 456, 123, 456]
list3.count(123)
#返回:3。count方法返回指定元素在列表中出现的次数
list3.index(456)
#返回:1。index方法返回指定元素在列表中第一次出现的索引
list3.index(456,3,5)
#返回:3。后两个参数指定查询索引的范围
list3.index(456,4,5)
#返回:ValueError:456 is not in list。没找到时会返回错误
list3.index(456,4,6)
#返回:5。第三个参数是右边界,不包括在查询范围内
test
#值:[123, ['abc', 'def'], 456]
test.reverse()
test
#返回:[456, ['abc','def'], 123]。注意到元素翻转了,但列表中的列表没有翻转,若要将其也翻转,需要指定下标再次操作:test[1].reverse()
test.sort()
#报错:TypeError:unorderable types:list()
listtest=[4,2,5,1,9,23,32,0]
listtest.sort()
listtest
#返回:[0, 1, 2, 4, 5, 9, 23, 32]
#sort()没有参数时,默认从小到大排序
#sort(func, key, reverse)。sort有三个参数,第一个是排序算法,第二个是和算法搭配的关键字,第三个参数是bool值,默认为False。若将reverse的值改为True,那么返回的将是从大到小排序。
listtest.sort(reverse=True)
listtest
#返回:[32, 23, 9, 5, 4, 2, 1, 0]注意:reverse()和sort()两个方法没有返回值,它们直接操作原列表

3. 补充关于列表分片和直接赋值的区别:

listtest
#值为:[32, 23, 9, 5, 4, 2, 1, 0]
list5=listtest[:]
list6=listtest
#此时list5和list6的值均为[32, 23, 9, 5, 4, 2, 1, 0]
listtest.sort()
#将listtest排序后,list5的值为[32, 23, 9, 5, 4, 2, 1, 0],list6的值为[0, 1, 2, 4, 5, 9, 23, 32]注意:只有针对原列表本身的操作才会引起这种情况,如果重新对原变量赋值,那么list6将不会改变关于append和extend的区别:
member=['a','b']
member.append(['c','d'])
#此时member值为:['a', 'b', ['c', 'd']]
member.extend(['e','f','g'])
#此时member值为:['a', 'b', ['c', 'd'], 'e', 'f', 'g']
append是将参数作为一个元素添加到列表的末尾;
extend是将参数作为一个列表去扩展列表的末尾。列表分片的步长属性:
list1=[1,3,9,5,7]
list1[0:5:2]
#返回:[1, 9, 7]
#步长不能为0
list1[::0]
#报错:ValueError: slice step cannot be zero
#步长为负数时从右到左
list1[::-2]
#返回:[7, 9, 1]
#步长大于列表长度时,仅返回指定的元素
list1[::8]
#返回:[1]
list1[3:9:7]
#返回:[5]请看例子:
old=[1,2,3,4,5]
new=old
old=[6]
print(new)
#得到结果为:[1, 2, 3, 4, 5]

注意:这里的赋值和第一个补充里的赋值不一样,new被赋值为old,但是之后old被赋予了另外的值,此时new的值不变;而第一个补充里的list6被赋值为listtest,而listtest本身作了改变,所以list6的值跟着改变。列表推导式(列表解析)

列表推导式(List comprehensions)也叫列表解析,用于动态地创建列表,其语法如下:

[有关A的表达式] for A in B
[x*xforxinrange(10)]
#返回:[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
#上面的列表推导式相当于:
list1=[]
forxinrange(10):
list1.append(x*x)
而列表推导式可以更为复杂一些:
[(x,y)forxinrange(10)foryinrange(10)ifx%2==0ify%2!=0]
#返回:[(0, 1), (0, 3), (0, 5), (0, 7), (0, 9),
(2,1),(2,3),(2,5),(2,7),(2,9),
(4,1),(4,3),(4,5),(4,7),(4,9),
(6,1),(6,3),(6,5),(6,7),(6,9),
(8,1),(8,3),(8,5),(8,7),(8,9)]
#上面的列表推导式相当于:
list1=[]
forxinrange(10):
foryinrange(10):
ifx%2==0:
ify%2!=0:
list1.append((x,y))

来做一个习题巩固一下:

list1=['1.Just do it','2.一切皆有可能','3.Impposible is nothing']
list2=['3.阿迪达斯','2.李宁','1.耐克']
#请编写一个列表推导式,使其返回的列表如下:
#['1.耐克:Just do it', '2.李宁:一切皆有可能', '3.阿迪达斯:Impossible is nothing']

下面是我的答案:

[y+':'+x.split('.',1)[1]forxinlist1foryinlist2ifx.split('.',1)[0]==y.split('.',1)[0]]

下面是参考答案:

[name+':'+slogan[2:]forsloganinlist1fornameinlist2ifslogan[0]==name[0]]

完(2015年6月8日)2015年6月24日,增加补充部分append与extend的区别

2015年6月29日,增加补充部分步长属性说明

2015年6月30日,增加补充部分剩余内容。请熟练掌握列表推导式