您的位置:首页 > 编程语言 > Python开发

python基础教程_学习笔记3:列表

2014-05-14 18:57 1286 查看

列表

list函数

字符串不能像列表一样被修改,所以有时候根据字符串创建列表会很有用。

list函数可以实现:

>>> list('signjing')

['s', 'i', 'g', 'n', 'j', 'i', 'n', 'g']

>>> list(['a','b'])

['a', 'b']

>>> list((1,2,'san'))

[1, 2, 'san']



可见:list函数适用于所有类型的序列,而不只是字符串。



同理,也可以将字符串组成的列表转换为字符串:

>>> ''.join(['a','b'])

'ab'

>>> ''.join(['abc','def'])

'abcdef'

注意:必须是字符串组成的列表才可以。

基本的列表操作

改变列表:元素赋值

使用索引标记为某个特定的,位置明确的列表元素赋值:

>>> list1=[1,3,4]

>>> list1[0]=2

>>> list1

[2, 3, 4]



>>> list1=[]

>>> list1[0]=2



Traceback (most recent call last):

File "<pyshell#67>", line 1, in <module>

list1[0]=2

IndexError: list assignment index out of range

可见:不能为不存在的列表元素赋值;

正如之前学过的:如果希望创建不存在具备一定长度空列表,请使用None;

删除元素

使用del语句删除列表元素;

>>> list1=['a','b',3]

>>> del list1[0]

>>> list1

['b', 3]

分片赋值

分片是个强大的特性,分片赋值更加强大;

>>> list1=list('qwer')

>>> list1[2:4]='ew'

>>> list1

['q', 'w', 'e', 'w']

也可以使用与原序列长度不同的列表对分片进行替换:

>>> name=list('signjing')

>>> name[4:]='so'

>>> name

['s', 'i', 'g', 'n', 's', 'o']

>>> name[4:]='englist'

>>> name

['s', 'i', 'g', 'n', 'e', 'n', 'g', 'l', 'i', 's', 't']

使用空的分片进行替换可以对原序列进行插入操作:

>>> list1=list('qwer')

>>> list1[2:2]='ab'

>>> list1

['q', 'w', 'a', 'b', 'e', 'r']

同理,也可以使用空的序列对分片进行删除操作:

>>> list1=list('qwer')

>>> list1[1:3]=''

>>> list1

['q', 'r']



在学习序列的分片操作时学习到步长的概念,同样可以分片赋值:

>>> name=list('signjing')

>>> name[1:7:2]='ABC'

>>> name

['s', 'A', 'g', 'B', 'j', 'C', 'n', 'g']



>>> name=list('signjing')

>>> name[-2:-7:-2]='-_='

>>> name

['s', 'i', '=', 'n', '_', 'i', '-', 'g']

列表方法

一般来说,方法的调用方法:

对象.方法(参数)

append

append方法在列表末尾追加新的对象。

注意:append方法和其它一些方法类似,只是在恰当位置修改原来的列表。

这意味着,它不是简单地返回一个修改过的新列表,而是直接修改原来的列表。



>>> list1=list("copyright")



>>> list1

['c', 'o', 'p', 'y', 'r', 'i', 'g', 'h', 't']

>>> list1.append('a')

>>> list1

['c', 'o', 'p', 'y', 'r', 'i', 'g', 'h', 't', 'a']



>>> list1.append([2])

>>> list1

['c', 'o', 'p', 'y', 'r', 'i', 'g', 'h', 't', 'a', [2]]



>>> list1.append((1,'3'))

>>> list1

['c', 'o', 'p', 'y', 'r', 'i', 'g', 'h', 't', 'a', [2], (1, '3')]

count

count方法统计某个元素在列表中出现的次数:

>>> list1

['c', 'o', 'p', 'y', 'r', 'i', 'g', 'h', 't', 'a', [2], (1, '3')]

>>> ['to','be','or','not','to','be'].count('to')

2

>>> x=[[1,2],1,[1,2,3],[1,2],1,3]

>>> x.count([1,2])

2

>>> x.count(1)

2

extend

extend方法可以在列表的末尾一次性追加另一个序列的多个值。

换句话说,可以用新列表扩展原有的列表:



>>> list1=list("copyright")

>>> list1

['c', 'o', 'p', 'y', 'r', 'i', 'g', 'h', 't']

>>> list1.extend('a')

>>> list1

['c', 'o', 'p', 'y', 'r', 'i', 'g', 'h', 't', 'a']

>>> list1.extend([2])

>>> list1

['c', 'o', 'p', 'y', 'r', 'i', 'g', 'h', 't', 'a', 2]

>>> list1.extend((1,'3'))

>>> list1

['c', 'o', 'p', 'y', 'r', 'i', 'g', 'h', 't', 'a', 2, 1, '3']





看起来很像连接操作,extend方法修改了被扩展的序列,而连接操作则不会,只是返回了一个全新的列表。

>>> a=list('copyright')

>>> b=list('a')

>>> c=a+b

>>> c

['c', 'o', 'p', 'y', 'r', 'i', 'g', 'h', 't', 'a']

>>> a

['c', 'o', 'p', 'y', 'r', 'i', 'g', 'h', 't']

>>> b

['a']



也可以通过分片赋值来达到extend方法的效果,但从可读性看来,显然不如extend。

>>> list1=list('copyright')

>>> list1[len(list1)-1]=[1,'3']

>>> list1

['c', 'o', 'p', 'y', 'r', 'i', 'g', 'h', [1, '3']]

index

index方法从列表中找出某值第一个匹配项的索引位置;

>>> list1=list('tomorrow')

>>> list1.index('r')

4

>>> list1.index('o')

1



如果找不到会引发错误:

>>> list1.index('z')

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

ValueError: list.index(x): x not in list



可以优化:

>>> if 'z' in list1:

... print list1.index('z')

... else:

... print "NOT FOUND"

...

NOT FOUND

insert

insert方法将对象插入到列表中;

>>> list1=list('tomorrow')

>>> list1.insert(1,'ab')

>>> list1

['t', 'ab', 'o', 'm', 'o', 'r', 'r', 'o', 'w']

>>> list1.insert(2,('a','b'))

>>> list1

['t', 'ab', ('a', 'b'), 'o', 'm', 'o', 'r', 'r', 'o', 'w']

>>> list1.insert(2,['a','b'])

>>> list1

['t', 'ab', ['a', 'b'], ('a', 'b'), 'o', 'm', 'o', 'r', 'r', 'o', 'w']



同extend方法,insert方法也可以通过分片赋值完成:

>>> list1=list('tomorrow')

>>> list1

['t', 'o', 'm', 'o', 'r', 'r', 'o', 'w']

>>> list1[1:1]=['ab']

>>> list1

['t', 'ab', 'o', 'm', 'o', 'r', 'r', 'o', 'w']

>>> list1[2:2]=[('a','b')]

>>> list1

['t', 'ab', ('a', 'b'), 'o', 'm', 'o', 'r', 'r', 'o', 'w']

>>> list1[2:2]=[['a','b']]

>>> list1

['t', 'ab', ['a', 'b'], ('a', 'b'), 'o', 'm', 'o', 'r', 'r', 'o', 'w']

pop

pop方法默认移除列表中的一个元素(默认是最后一个元素),并返回移除的这个元素;



>>> list1=list('tomorrow')

>>> list1.pop()

'w'

>>> list1

['t', 'o', 'm', 'o', 'r', 'r', 'o']



None不能被返回:

>>> list1=[None]*5

>>> list1

[None, None, None, None, None]

>>> list1.pop()

>>> list1

[None, None, None, None]



也可以通过索引指定要移除并返回的元素:

>>> list1.pop(3)

'o'

>>> list1

['t', 'o', 'm', 'r', 'r', 'o']



使用pop方法可以实现一种常见的数据结构——栈。

pop方法是出栈方法,python没有入栈方法,但可以通过append方法代替;

>>> list1=list("zhan")

>>> list1

['z', 'h', 'a', 'n']

>>> list1.append(list1.pop())

>>> list1

['z', 'h', 'a', 'n']

当入栈的元素等于刚刚出栈的元素时,得到的结果还是原来的栈;

remove

remove方法移除某值的第一个匹配项;

>>> list1=list('tomoto')

>>> list1.remove('o')

>>> list1

['t', 'm', 'o', 't', 'o']

同index方法一样,当无匹配项时,返回错误:

>>> list1.remove('b')

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

ValueError: list.remove(x): x not in list



remove方法是一个没有返回值的原位置改变方法,与pop正好相反;

reverse

reverse方法将列表元素反向存放;

>>> list1=list('abcde')

>>> list1.reverse()

>>> list1

['e', 'd', 'c', 'b', 'a']

该方法改变了列表,但也没有返回值,这一点同remove和sort方法;

sort

sort方法用于在原位置对列表进行排序。在“原位置排序”意味着改变原来的列表,从而让其中的元素能够按一定的顺序排列,而不是简单地返回一个已排序的列表副本。



当用户需要返回列表的已排序副本,同时又不希望改变列表时,是否可以这样:

>>> list1=list('signjing')

>>> list2=list1.sort()

答案是否定的,通过这种方式得到的list2是空值;



但可以通过将列表副本赋予新的列表,然后再使用sort方法进行排序:

>>> list1=list('signjing')

>>> list2=list1[:]

>>> list2.sort()

>>> list2

['g', 'g', 'i', 'i', 'j', 'n', 'n', 's']

>>> list1

['s', 'i', 'g', 'n', 'j', 'i', 'n', 'g']

再次强调,list1[:]是包含了列表list1所有元素的分片,这是一种很有效率的复制列表的方法。

另一种获取列表已排序列表副本的方法是使用sorted函数:

>>> list1=list('signjing')

>>> list2=sorted(list1)

>>> list2

['g', 'g', 'i', 'i', 'j', 'n', 'n', 's']

>>> list1

['s', 'i', 'g', 'n', 'j', 'i', 'n', 'g']



只是简单地将列表赋值给新的列表,是不可以的。因为,这样做,让list1和list2指向了同一个列表:

>>> list1=list('signjing')

>>> list2=list1

>>> list2.sort()

>>> list2

['g', 'g', 'i', 'i', 'j', 'n', 'n', 's']

>>> list1

['g', 'g', 'i', 'i', 'j', 'n', 'n', 's']



如果希望将一些元素按相反的顺序排序,可以先使用sort方法(或sort函数),然后再使用reverse方法。或者也可以直接使用reverse参数。

列表方法小结

方法名称修改列表返回值
append 修改
count 不修改
extend修改
index 不修改
insert修改
pop修改
remove 修改
reverse 修改
sort 修改
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: