Python理论4 列表

列表的数据类型

列表是一个有序序列中包含多个值的值。
列表值指的是列表本身(该值可以存储在变量中,也可以像传递其他值一样传递给函数),而不是列表值中的值。值得注意的是列表值中的值得数据类型是不需要是同一种类型的。

代码举例:

   >>> [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 += aspam = spam + a
spam -= aspam = spam - a
spam *= aspam = spam * a
spam /= aspam = spam / a
spam %= aspam = 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( )。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值