首页 > 代码库 > [Python 3系列]列表

[Python 3系列]列表

列表和元组可以包含多个值。而且,由于列表本身又可以包含其他列表,所以可以用它们将数据安排成层次结构。


列表数据类型

“列表”是一个值,它包含多个字构成的序列。

[]是一个空列表,不包含任何值,类似于空字符串‘’。

技术分享

可以用下表取得列表中的单个值。列表中第一个值的下标是0,第二个值的下标是1,依此类推。

负数下标中,整数值-1指的是列表中的最后一个下标,-2指的是列表中倒数第二个下标,依此类推。如:sample[8],sample[-1],在上图中,它们的值都是9。

如果使用的下标超出了列表中值的个数,Python会报错IndexError。

下标只能是整数,不能是浮点数。

列表也可以包含其他列表值。这些列表中的值,可以通过多重下标来访问。

>>> list=[[‘a‘,‘b‘,‘c‘],[1,2,3],‘abc‘,123]
>>> list[1][2]
3


“切片”可以从列表中取得多个值,结果是一个新列表。

切片向上增长,直至第二个下标的值,但不包括它。

省略第一个下标相当于使用0,或者列表的开始。

省略第二个下标相当于使用列表的长度,意味着分片直至列表的末尾。

>>> list[0:2]
[[‘a‘, ‘b‘, ‘c‘], [1, 2, 3]]
>>> list[:2]
[[‘a‘, ‘b‘, ‘c‘], [1, 2, 3]]
>>> list[:]
[[‘a‘, ‘b‘, ‘c‘], [1, 2, 3], ‘abc‘, 123]


使用len()函数可以获取列表的长度。

>>> len(list)
4
>>> len(list[0])
3


可以使用下标改变列表中的值。

>>> list[3]=‘newvalue‘
>>> list
[[‘a‘, ‘b‘, ‘c‘], [1, 2, 3], ‘abc‘, ‘newvalue‘]
>>> list[0][2]=‘newC‘
>>> list
[[‘a‘, ‘b‘, ‘newC‘], [1, 2, 3], ‘abc‘, ‘newvalue‘]


“+”操作符可以连接两个列表,得到一个新列表。

“*”操作符可以用于一个列表和一个整数,实现列表的复制。

>>> [1,2,3]+[‘a‘,‘b‘,‘c‘]
[1, 2, 3, ‘a‘, ‘b‘, ‘c‘]
>>> [‘a‘,‘b‘]*5
[‘a‘, ‘b‘, ‘a‘, ‘b‘, ‘a‘, ‘b‘, ‘a‘, ‘b‘, ‘a‘, ‘b‘]


del语句将删除列表中下标处的值,表中被删除值后面的所有值,都将向前移动一个下标。

>>> newlist
[1, 2, 3, ‘a‘, ‘b‘, ‘c‘]
>>> del newlist[-2]
>>> newlist
[1, 2, 3, ‘a‘, ‘c‘]


使用列表

在for循环中使用range(len(someList)),迭代列表的每一个下标。

>>> for i in range(len(newlist)):
...     print(newlist[i])
...
1
2
3
a
c


利用in和not in操作符,可以确定一个值是否在列表中。

>>> ‘a‘ in newlist
True
>>> ‘c‘ not in newlist
False


“+=”操作符可以完成字符串和列表的连接。

“*=”操作符可以完成字符串和1的复制。

>>> list=‘hello‘
>>> list += ‘ world‘
>>> list
‘hello world‘
>>> newlist=[‘a‘,‘b‘]
>>> newlist *=3
>>> newlist
[‘a‘, ‘b‘, ‘a‘, ‘b‘, ‘a‘, ‘b‘]


方法

方法和函数是一回事,只是它是调用在一个值上。

每种数据类型都有它自己的一组方法。


index()方法,可以传入一个值,如果该值存在于列表中,就返回它的下标。如果不存在,就报错ValueError。

如果列表中存在重复的值,就返回它第一次出现的下标。

>>> newlist
[‘a‘, ‘b‘, ‘a‘, ‘b‘, ‘a‘, ‘b‘]
>>> newlist.index(‘b‘)
1


append()方法,可以将参数添加到列表末尾。

insert()方法,可以在列表任意下标处插入一个值。

append()和insert()方法是列表方法,只能在列表上调用,不能在其他值上调用。

>>> newlist.append(‘cat‘)
>>> newlist.insert(3,‘dog‘)
>>> newlist
[‘a‘, ‘b‘, ‘a‘, ‘dog‘, ‘b‘, ‘a‘, ‘b‘, ‘cat‘]


给remove()方法传入一个值,它将从被调用的列表中删除。

试图删除列表中不存在的值,将导致ValueError错误。

如果该值在列表中出现多次,只有第一次出现的值会被删除。

如果知道想要删除的值在列表中的下标,del语句就很好用。

如果知道想要从列表中删除的值,remove()方法就很好用。

>>> newlist.remove(‘dog‘)
>>> newlist
[‘a‘, ‘b‘, ‘a‘, ‘b‘, ‘a‘, ‘b‘, ‘cat‘]


sort()方法用于排序。sort()方法会对列表当场排序。

不能对既有数字又有字符串值的列表排序。

sort()方法对字符串排序时,使用ASCII字符排序。

如果需要按普通字典顺序排序,将关键字参数key设置为str.lower。

可以指定reverse关键字参数为True,让sort()按逆序排列。

>>> sample
[1, 3, 5, 7, 2, 4, 6]
>>> sample.sort()
>>> sample
[1, 2, 3, 4, 5, 6, 7]
>>> sample.sort(reverse=True)
>>> sample
[7, 6, 5, 4, 3, 2, 1]
>>> sample=sample+[‘abc‘]
>>> sample.sort()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unorderable types: str() < int()


类似列表的类型:字符串和元组

技术分享

字符串和列表实际上很相似,可以认为是单个文本字符的列表。对于列表的许多操作,也可以作用于字符串,按下标取值、切片、用于for循环、用于len(),以及用于in和not in操作符。

列表是“可变的”数据类型,它的值可以添加、删除或改变。但是,字符串是“不可变的”,它不能被更改。

“改变”一个字符串的正确方式,是使用切片和连接。构造一个“新的”字符串,从老的字符串里复制一些部分。

>>> name=‘Big Mike‘
>>> name[4:]
‘Mike‘
>>> newName=‘I am ‘+name[4:]
>>> newName
‘I am Mike‘


元组数据类型,它是列表数据类型的不可变形式。

元组输入时用圆括号(),而不是用方括号[]。

如果元组中只有一个值,可以在括号内该值的后面跟上一个逗号,表明是元组而不是字符串。

>>> name=(‘Big Mike‘,‘little Tom‘,‘Good Jack‘)
>>> name[1:2]
(‘little Tom‘,)
>>> name[2]=‘Bad Marry‘
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: ‘tuple‘ object does not support item assignment


使用list()和tuple()函数转换列表和元组的类型,它们将返回传递给它们的值的列表和元组版本。

>>> tuple([1,2,3])
(1, 2, 3)
>>> list((1,2,3))
[1, 2, 3]
>>> list(‘hello‘)
[‘h‘, ‘e‘, ‘l‘, ‘l‘, ‘o‘]


引用

列表引用是指向一个列表的值。

当创建列表时,将对它引用赋给了变量。

变量就像包含着值的盒子。

当函数被调用时,参数的值被复制给变元。对于列表,这意味着变元得到的是引用的拷贝。

>>> a=11
>>> b=a
>>> a=100
>>> a
100
>>> b
11

>>> c=[1,2,3,4]
>>> d=c
>>> c[1]=5
>>> c
[1, 5, 3, 4]
>>> d
[1, 5, 3, 4]


copy.copy()函数,可以用来复制列表或字典这样的可变值,而不只是复制引用。

如果要复制的列表中包含了列表,那就使用copy.deepcopy()函数来代替。deepcopy()函数将同事复制它们内部的列表。

>>> import copy
>>> list=[‘a‘,‘b‘,‘c‘]
>>> newlist=copy.copy(list)
>>> newlist[1]=100
>>> list
[‘a‘, ‘b‘, ‘c‘]
>>> newlist
[‘a‘, 100, ‘c‘]

>>> list=[1,2,3,[4,5,6,[7,8,9]]]
>>> newlist1=copy.copy(list)
>>> newlist1[3][0]=‘abc‘
>>> newlist1[1]=‘abc‘
[1, 2, 3, [‘abc‘, 5, 6, [7, 8, 9]]]
>>> newlist1
[1, 2, 3, [‘abc‘, 5, 6, [7, 8, 9]]]
>>> list
[1, 2, 3, [‘abc‘, 5, 6, [7, 8, 9]]]

>>> list=[1,2,3,[4,5,6]]
>>> newlist1=copy.copy(list)
>>> newlist2=copy.deepcopy(list)
>>> list[2]=100
>>> newlist1
[1, 2, 3, [4, 5, 6]]
>>> newlist2
[1, 2, 3, [4, 5, 6]]
>>> list[3][0]=100
>>> newlist1
[1, 2, 3, [100, 5, 6]]
>>> newlist2
[1, 2, 3, [4, 5, 6]]


本文出自 “乱码时代” 博客,请务必保留此出处http://juispan.blog.51cto.com/943137/1945641

[Python 3系列]列表