“一起学习,一起成长!”
与字符串不同的是,元组和列表并不要求所有元素的种类相同,每个元素都可以是任何python类型的对象。
列表可变,赋值后可插入或删除其中的元素。
元组不可变,赋值后不可更改
1.列表
1.1使用[]或list[]创建列表
使用[]创建列表:
>>>empty=[]
>>>weekdays=['Monday','Tuesday','Wednesday']
使用list()创建列表:
>>>another_empty_list=list() #返回空列表
1.2使用list()将其他数据类型转换成列表
将一个字符串转换成了由单个字母组成的列表
>>>list('cat')
['c','a','t']
将一个元组转换成了列表
>>>a_tuple=('ready','fire','aim')
>>>list(a_tuple)
['ready','fire','aim']
使用split()可以依据分隔符将字符串切割成由若干子串组成的列表:
>>>birthday='1/6/1952'
>>>birthday.split('/')
['1','6','1952']
>>>splitme='a/b//c/d///e'
>>> splitme.split('/')
['a', 'b', '', 'c', 'd', '', '', 'e'] #返回空串元素
>>>splitme='a/b//c/d///e'
>>> splitme.split('//')
['a/b', 'c/d', '/e']
1.3使用[offset]获取元素
和字符串一样,通过偏移量可以从列表中提取对应位置的元素:
>>> marxes=['Groucho','Chico','Harpo']
>>> marxes[0]
'Groucho'
>>> marxes[1]
'Chico'
>>> marxes[2]
'Harpo'
负偏移量代表从尾部开始计数:
>>> marxes[-1]
'Harpo'
>>> marxes[-2]
'Chico'
>>> marxes[-3]
'Groucho'
1.4包含列表的列表
列表中的列表是一个元素
>>> small_birds=['hummingbird','finch']
>>> extinct_birds=['dodo','passenger pigeon','Norwegian Blue']
>>> carol_birds=[3,'French hens',2,'turtledoves']
>>> all_birds=[small_birds,extinct_birds,'macaw',carol_birds]
>>> all_birds
[['hummingbird', 'finch'], ['dodo', 'passenger pigeon', 'Norwegian Blue'], 'macaw', [3, 'French hens', 2, 'turtledoves']]
>>> all_birds[0]
['hummingbird', 'finch']
>>> all_birds[1]
['dodo', 'passenger pigeon', 'Norwegian Blue']
双重索引
>>> all_birds[1][0]
'dodo'
1.5使用[offset]修改元素
可以通过赋值对列表中元素进行修改:
>>> marxes=['Groucho','Chico','Harpo']
>>> marxes[2]='Wanda'
>>> marxes
['Groucho', 'Chico', 'Wanda']
通过这种方式无法修改字符串中的指定字符,因为字符串是不可变的。
1.6指定范围并使用切片提取元素
>>> marxes=['Groucho','Chico','Harpo']
>>> marxes[0:2]
['Groucho', 'Chico']
列表的切片仍然是一个列表。
>>> marxes[::2]
['Groucho', 'Harpo']
>>> marxes[::-2]
['Harpo', 'Groucho']
利用切片可以巧妙地实现列表逆序:
>>> marxes[::-1]
['Harpo', 'Chico', 'Groucho']
1.7使用append()添加元素至尾部
列表是可变的:
>>> marxes=['Groucho','Chico','Harpo']
>>> marxes.append('Zeppo')
>>> marxes
['Groucho', 'Chico', 'Harpo', 'Zeppo']
1.8使用extend()或+=合并列表
使用extend()可以将一个列表合并到另一个列表中。
>>> marxes=['Groucho','Chico','Harpo','Zeppo']
>>> others=['Gummo','Karl']
>>> marxes.extend(others)
>>> marxes
['Groucho', 'Chico', 'Harpo', 'Zeppo', 'Gummo', 'Karl']
也可以使用+=:
>>> marxes=['Groucho','Chico','Harpo','Zeppo']
>>> others=['Gummo','Karl']
>>> marxes+=others
>>> marxes
['Groucho', 'Chico', 'Harpo', 'Zeppo', 'Gummo', 'Karl']
如果错误地使用了append(),那么others会被当成一个单独的元素进行添加,而不是将其中的内容进行合并:
>>> marxes=['Groucho','Chico','Harpo','Zeppo']
>>> others=['Gummo','Karl']
>>> marxes.append(others)
>>> marxes
['Groucho', 'Chico', 'Harpo', 'Zeppo', 'Gummo', 'Karl', ['Gummo', 'Karl']]
1.9使用insert()在指定位置插入元素
append()函数只能将新元素插入到列表尾部,而使用insert()可以将元素插入到列表的任意位置。指定偏移量为0可以插入列表头部。如果指定的偏移量超过了尾部,则会插入到列表最后,就如同append()一样,这一操作不会产生Python异常。
>>> marxes.insert(3,'Gummo')
>>> marxes
['Groucho', 'Chico', 'Harpo', 'Gummo', 'Zeppo', 'Gummo', 'Karl']
1.10使用del删除指定位置的元素
>>> del marxes[-1]
>>> marxes
['Groucho', 'Chico', 'Harpo', 'Gummo', 'Zeppo', 'Gummo']
当列表中一个元素被删除后,位于它后面的元素会自动往前移动填补空出的位置,且列表长度减1。
>>> marxes[2]
'Harpo'
>>> del marxes[2]
>>> marxes
['Groucho', 'Chico', 'Gummo', 'Zeppo', 'Gummo']
>>> marxes[2]
'Gummo'
1.11使用remove()删除具有指定值的元素
如果不确定或不关心元素在列表中的位置,可以使用remove()根据指定的值删除元素:
>>> marxes=['Groucho','Chico','Harpo','Zeppo']
>>> marxes.remove('Harpo')
>>> marxes
['Groucho', 'Chico', 'Zeppo']
1.12使用pop()获取并删除指定位置的元素
使用pop()同样可以获取列表中指定位置的元素,但在获取完成后,该元素会被自动删除。如果你为pop()指定了偏移量,它会返回偏移量对应位置的元素;如果不指定,则默认使用-1。
>>> marxes=['Groucho','Chico','Harpo','Zeppo']
>>> marxes.pop()
'Zeppo'
>>> marxes
['Groucho', 'Chico', 'Harpo']
>>> marxes.pop(1)
'Chico'
>>> marxes
['Groucho', 'Harpo']
计算机术语:
如果使用append()来添加元素到尾部,并通过pop()从尾部删除元素,实际上,实现了一个被称为LIFO(后进先出)队列的数据结构。我们更习惯称之为栈(stack)。如果使用pop(0)来删除元素则创建了一个FIFO(先进先出)队列。这两种数据结构非常有用,你可以不断接收数据,并根据需求对最先到达的数据(FIFO)或最后到达的数据(LIFO)进行处理。
1.13使用index()查询具有特定值的元素位置
如果想知道等于某一个值的元素位于列表的什么位置,可以使用index()函数进行查询:
>>> marxes=['Groucho','Chico','Harpo','Zeppo']
>>> marxes.index('Chico')
1
1.14使用in判断值是否存在
判断一个值是否存在于给定的列表中由许多方式,其中最具有Python风格的是使用in:
>>> marxes=['Groucho','Chico','Harpo','Zeppo']
>>> 'Groucho' in marxes
True
>>> 'Bob' in marxes
False
同一个值可能出现在列表的多个位置,但只要出现一次,in就回返回True:
>>> words=['a','deer','a','female','deer']
>>> 'deer' in words
True
1.15使用count()记录特定值出现的次数
使用count()可以记录某一个特定值在列表中出现的次数:
>>> words=['a','deer','a','female','deer']
>>> 'deer' in words
True
>>> words.count('a')
2
>>> words.count(1)
0
1.16使用join()转换为字符串
>>> friends=['Harry','Hermione','Ron']
>>> separator='*'
>>> joined=separator.join(friends)
>>> joined
'Harry*Hermione*Ron'
>>> separated=joined.split(separator)
>>> separated
['Harry', 'Hermione', 'Ron']
1.17使用sort()重新排列元素
在实际应用中,经常需要将列表中的元素按值排序,Python为此提供了两个函数:
1.列表方法sort()会对原列表进行排序,改变原列表内容;
2.通用函数sorted()则会返回排好序的列表副本,原列表内容不变。
a.数字元素,默认升序。使用reverse=True改变为降序排列。
b.字符串元素按字母表顺序排序。
>>> marxes=['Groucho','Chico','Harpo','Zeppo']
>>> marxes.pop()
'Zeppo'
>>> marxes
['Groucho', 'Chico', 'Harpo']
>>> sorted_marxes=sorted(marxes)
>>> sorted_marxes
['Chico', 'Groucho', 'Harpo']
sorted_marxes是一个副本,它的创建并不会改变原始列表的内容:
>>> marxes
['Groucho', 'Chico', 'Harpo']
但对marxes列表调用列表函数sort()则会改变它的内容:
>>> marxes.sort()
>>> marxes
['Chico', 'Groucho', 'Harpo']
能够自动地互相转换的多种类型元素列表,也可使用sort():
>>> numbers=['2','1','4.0','3']
>>> numbers.sort()
>>> numbers
['1', '2', '3', '4.0']
默认的排序是升序的,通过添加参数reverse=True可以改变为降序排序:
>>> numbers.sort(reverse=True)
>>> numbers
['4.0', '3', '2', '1']
1.18使用len()获取长度
len()可以返回列表长度:
>>> marxes=['Groucho', 'Chico', 'Harpo']
>>> len(marxes)
3
1.19使用=赋值,使用copy()复制
>>> a=[1,2,3]
>>> a
[1, 2, 3]
>>> b=a
>>> b
[1, 2, 3]
>>> a[0]='surprise'
>>> a
['surprise', 2, 3]
>>> b
['surprise', 2, 3]
b与a实际上指向的是同一个对象,因此,无论我们是通过a还是b来修改列表的内容,其结果都会作用于双方:
>>> b
['surprise', 2, 3]
>>> b[0]='I hate surprise'
>>> b
['I hate surprise', 2, 3]
>>> a
['I hate surprise', 2, 3]
>>> len(marxes)
3
通过下面任意一种方法,都可以将一个列表的值赋值到另一个新的列表中:
1.列表copy()
2.list()转换函数
3.列表分片[:]
>>> a=[1,2,3]
>>> b=a.copy()
>>> c=list(a)
>>> d=a[:]
再次注意,在这个例子中,b、c、d都是a的赋值:它们是自身带有值的新对象,与原始的a所指向的列表对象[1,2,3]没有任何关联。改变a不影响b、c和d的复制。
>>> a[0]='integer lists are boring'
>>> a
['integer lists are boring', 2, 3]
>>> b
[1, 2, 3]
>>> c
[1, 2, 3]
>>> d
[1, 2, 3]
2.元组
与列表类似,元组也是由任意类型元素组成的序列。与列表不同的是,元组是不可变的,这意味着一旦元组被定义,将无法再进行增加、删除或修改元素等操作。因此,元组就像是一个常量列表。
2.1使用()创建元组
>>> empty_tuple=()
>>> empty_tuple
()
创建包含一个或多个元素的元组时,每一个元素后面都需要跟着一个逗号,即使只包含一个元素也不能省略:
>>> one_marx='Groucho',
>>> one_marx
('Groucho',)
如果创建的元组所包含的元素数量超过1,最后一个元素后面的逗号可以省略:
>>> marx_tuple='Groucho','Chico','Harpo'
>>> marx_tuple
('Groucho', 'Chico', 'Harpo')
可以一口气将元组赋值给多个变量:
>>> marx_tuple=('Groucho','Chico','Harpo')
>>> a,b,c=marx_tuple
>>> a
'Groucho'
>>> b
'Chico'
>>> c
'Harpo'
有时候这个过程被称为元组解包。
可以利用元组在一条语句中对多个变量的值进行交换,而不需要借助临时变量:
>>> password='swordfish'
>>> icecream='tuttifrutti'
>>> password,icecream=icecream,password
>>> password
'tuttifrutti'
>>> icecream
'swordfish'
tuple()函数可以用其他类型的数据来创建元组:
>>> marx_list=['Groucho','Chico','Harpo']
>>> tuple(marx_list)
('Groucho', 'Chico', 'Harpo')
2.2元组与列表
在许多地方都可以用元组代替列表,但元组的方法函数与列表相比要少一些。元组的优势:
- 元组占用的空间较小
- 你不会意外修改元组的值
- 可以将元组用作字典的键
- 命名元组可以作为对象的迭代
- 函数的参数是以元组形式传递的