文章目录
列表的数据类型
列表是一个有序序列中包含多个值的值。
列表值指的是列表本身(该值可以存储在变量中,也可以像传递其他值一样传递给函数),而不是列表值中的值。值得注意的是列表值中的值得数据类型是不需要是同一种类型的。
代码举例:
>>> [1, 2, 3]
[1, 2, 3]
>>> ['cat', 'bat', 'rat', 'elephant']
['cat', 'bat', 'rat', 'elephant']
>>> ['hello', 3.1415, True, None, 42]
['hello', 3.1415, True, None, 42]
>>> spam = ['cat', 'bat', 'rat', 'elephant']
>>> spam
['cat', 'bat', 'rat', 'elephant']
索引
与C语言区别开的是python中的列表第一个值的是零。
spam = ['cat', 'bat', 'rat', 'elephant']
在spam这个变量中储存的列表值中bat为spam[1],而cat为spam[0]。
>>> spam[0]
>>>'cat’
如图:
当索引从0开始并向上时,还可以对索引使用负整数。整数值-1表示列表中的最后一个索引,值-2表示列表中倒数第二个索引,依此类推。
用上面的代码演示:
>>> spam[-1]
>>>'elephant’
列表切片
正如索引可以从列表中获取单个值一样,切片也可以以新列表的形式从列表中获取多个值。切片是在方括号之间键入的,类似于索引,但它有两个用冒号分隔的整数。
spam[2] 是一个列表索引 (one integer).
spam[1:4] 是一个列表切片 (two integers).
>>> spam = ['cat', 'bat', 'rat', 'elephant']
>>> spam[0:4]
['cat', 'bat', 'rat', 'elephant']
>>> spam[1:3]
['bat', 'rat']
>>> spam[0:-1]
['cat', 'bat', 'rat']
可以省略切片中冒号两侧的一个或两个索引。省略第一个索引与使用0或列表的开头相同。省略第二个索引与使用列表的长度相同,它将切片到列表的末尾。
>>> spam = ['cat', 'bat', 'rat', 'elephant']
>>> spam[:2]
['cat', 'bat']
>>> spam[1:]
['bat', 'rat', 'elephant']
>>> spam[:]
['cat', 'bat', 'rat', 'elephant']
len( )
len( )函数将返回传递给它的列表值中的值的数量,就像它可以计算字符串值中的字符数量一样。
>>> spam = ['cat', 'dog', 'moose']
>>> len(spam)
3
修改列表值中的值
利用索引修改
>>> spam = ['cat', 'bat', 'rat', 'elephant']
>>> spam[1] = 'aardvark'
>>> spam
['cat', 'aardvark', 'rat', 'elephant']
>>> spam[2] = spam[1]
>>> spam
['cat', 'aardvark', 'aardvark', 'elephant']
>>> spam[-1] = 12345
>>> spam
['cat', 'aardvark', 'aardvark', 12345]
如果要删除列表中的某值需要用到del 及索引
>>> spam = ['cat', 'bat', 'rat', 'elephant']
>>> del spam[2]
>>> spam
['cat', 'bat', 'elephant']
>>> del spam[2]
>>> spam
['cat', 'bat']
列表的运算
列表的运算包括加法和乘法,前者主要用于合并列表,后者主要用于复制列表。
>>> [1, 2, 3] + ['A', 'B', 'C']
[1, 2, 3, 'A', 'B', 'C']
>>> ['X', 'Y', 'Z'] * 3
['X', 'Y', 'Z', 'X', 'Y', 'Z', 'X', 'Y', 'Z']
>>> spam = [1, 2, 3]
>>> spam = spam + ['A', 'B', 'C']
>>> spam
[1, 2, 3, 'A', 'B', 'C']
列表+for循环
利用for循环可以遍历列表中的元素
for i in [0, 1, 2, 3]:
print(i)
执行结果为
0
1
2
3
TIPS:
一种常见的Python技术是使用range(len(someList))和for循环来迭代列表的索引。
>>> supplies = ['pens', 'staplers', 'flame-throwers', 'binders']
>>> for i in range(len(supplies)):
print('Index ' + str(i) + ' in supplies is: ' + supplies[i])
执行结果:
Index 0 in supplies is: pens
Index 1 in supplies is: staplers
Index 2 in supplies is: flame-throwers
Index 3 in supplies is: binders
for循环中使用range(len(supplies))非常方便,因为循环中的代码可以访问索引(作为变量i)和索引处的值(作为supplies[i])。最重要的是,range(len(supplies))将遍历supplies的所有索引,无论其中包含多少项。
in和not in
可以使用in和not in操作符确定值是否在列表中。和其他操作符一样,in和not in在表达式中使用,并连接两个值:一个是要在列表中查找的值,另一个是可以找到它的列表。结果是布尔值。
应用实例:
myPets = ['Zophie', 'Pooka', 'Fat-tail']
print('Enter a pet name:')
name = input()
if name not in myPets:
print('I do not have a pet named ' + name)
else:
print(name + ' is my pet.')
执行结果:
Enter a pet name:
Footfoot
I do not have a pet named Footfoot
增强赋值操作符
在使用迭代器的时候用得比较多,通常和循环联用。
左 | 右 |
---|---|
spam += a | spam = spam + a |
spam -= a | spam = spam - a |
spam *= a | spam = spam * a |
spam /= a | spam = spam / a |
spam %= a | spam = spam % a |
a为任意值(有意义)
代码举例:
s=0
while s <8:
s+=2
print(s)
执行结果:
2
4
6
8
列表的操作方法与技巧
多重赋值技巧
多重赋值技巧是一种快捷方式,它允许您在一行代码中使用列表中的值分配多个变量。
一下两种代码是等价的,明显后者更方便。
>>> cat = ['fat', 'orange', 'loud']
>>> size = cat[0]
>>> color = cat[1]
>>> disposition = cat[2]
>>> cat = ['fat', 'orange', 'loud']
>>> size, color, disposition = cat
需要注意的是格式必须一一对应
多重赋值技巧也可以用来交换两个变量的值:
>>> a, b = 'Alice', 'Bob'
>>> a, b = b, a
>>> print(a)
'Bob'
>>> print(b)
'Alice'
index( )
列表值有一个index()方法,该方法可以传递一个值,如果该值存在于列表中,则返回该值的索引。如果该值不在列表中,那么Python将生成一个ValueError错误。
代码示例:
>>> spam = ['hello', 'hi', 'howdy', 'heyas']
>>> spam.index('hello')
0
>>> spam.index('heyas')
3
append( )和 insert( )
<1> append( )在列表默认最后一位添加值。
name.append(a),a为要添加的值。
>>> spam = ['cat', 'dog', 'bat']
>>> spam.append('moose')
>>> spam
['cat', 'dog', 'bat', 'moose']
<2>insert( ) 可在列表任意位置指定添加值。
name.insert(a,b)
a是索引,b是要填加的值。
>>> spam = ['cat', 'dog', 'bat']
>>> spam.insert(1, 'chicken')
>>> spam
['cat', 'chicken', 'dog', 'bat']
remove( )
用于删除列表中的值,与del 不同的是del是通过索引删除,remove( )是通过搜索列表中的值,如果有对应的值,将其删去。
>>> spam = ['cat', 'bat', 'rat', 'elephant']
>>> spam.remove('bat')
>>> spam
['cat', 'rat', 'elephant']
如果该值在列表中出现多次,则只删除该值的第一个实例。
>>> spam = ['cat', 'bat', 'rat', 'cat', 'hat', 'cat']
>>> spam.remove('cat')
>>> spam
['bat', 'rat', 'cat', 'hat', 'cat']
sort( )
可以使用sort()方法对数值列表或字符串列表进行排序。
排序规则为数字按大小,字符串按首字母(ASCII顺序)
>>> spam = [2, 5, 3.14, 1, -7]
>>> spam.sort()
>>> spam
[-7, 1, 2, 3.14, 5]
>>> spam = ['ants', 'cats', 'dogs', 'badgers', 'elephants']
>>> spam.sort()
>>> spam
['ants', 'badgers', 'cats', 'dogs', 'elephants']
使用sort(reverse=True),也可以倒叙。
>>> spam.sort(reverse=True)
>>> spam
['elephants', 'dogs', 'cats', 'badgers', 'ants']
TIPS:
(1)不要试图通过编写像spam = spam.sort()这样的代码来捕获返回值。
(2)不能对同时包含数字值和字符串值的列表进行排序,因为Python不知道如何比较这些值。
(3)第三,sort()对字符串排序使用“ASCII顺序”,而不是实际的字母顺序。这意味着大写字母在小写字母之前。
>>> spam = ['Alice', 'ants', 'Bob', 'badgers', 'Carol', 'cats']
>>> spam.sort()
>>> spam
['Alice', 'Bob', 'Carol', 'ants', 'badgers', 'cats']
可变和不可变的数据类型
列表值是一种可变的数据类型:它可以添加、删除或更改值。然而,字符串是不可变的:它不能被更改。尝试在字符串中重新分配一个字符会导致一个类型错误。正确的方式是使用切片。
>>> name = 'Zophie a cat'
>>> newName = name[0:7] + 'the' + name[8:12]
>>> name
'Zophie a cat'
>>> newName
'Zophie the cat'
元组
元组是⼀个固定⻓度,不可改变的Python序列对象。创建元组的最简单⽅式,是⽤逗号分隔⼀列值:
tup =4,5,6
tup
(4,5,6)
⽤tuple可以将任意序列或迭代器转换成元组:
tuple([4,0,2])
(4,0,2)
tup=tuple('string')
tup
('s','t','r','i','n','g')
可以⽤⽅括号访问元组中的元素。和C、 C++、 JAVA等语⾔⼀样,序列是从0开始的:
tup[0]
's'
元组中存储的对象可能是可变对象。⼀旦创建了元组,元组中的对象就不能修改了,如果元组中的某个对象是可变的,⽐如列表,可以在原位进⾏修改:
tup[1].append(3)
tup
('foo',[1,2,3],True)
列表的引用与复制
列表的引用
>>> spam = [0, 1, 2, 3, 4, 5]
>>> cheese = spam
>>> cheese[1] = 'Hello!'
>>> spam
[0, 'Hello!', 2, 3, 4, 5]
>>> cheese
[0, 'Hello!', 2, 3, 4, 5]
产生该结果的原因是两个变量的值都是列表的引用而非列表本身。若对列表进行修改,则两个变量的值都发生改变。
示意图:
spam变量赋予列表的引用。
cheese赋予了spam的值也就是列表的引用。
对列表进行修改后,两个变量的值都发生了变化,因为他们的值都是列表的引用。
copy模块
虽然传递引用通常是处理列表和字典最方便的方法,但是如果函数修改了传递的列表或字典,您可能不希望原始列表或字典值发生这些更改。为此,Python提供了一个名为copy的模块,该模块同时提供copy( )和deepcopy( )函数。第一个是copy.copy(),它可以用来复制可变值,比如列表或字典,而不仅仅是引用的副本。
代码示意:
>>> import copy
>>> spam = ['A', 'B', 'C', 'D']
>>> cheese = copy.copy(spam)
>>> cheese[1] = 42
>>> spam
['A', 'B', 'C', 'D']
>>> cheese
['A', 42, 'C', 'D']
在这里变量cheese被赋予的其实是一个新的列表,该列表实际上是有copy.copy(spam)建立的,也就是说这两个变量的值相同但是是对两个不同的列表进行的引用,所以是相对独立的。
需要注意的是如果需要复制的列表中的值还有列表的话需要用到deepcopy( )。