赞
踩
写在前面的话:内容有点多,分两篇发。这是第一篇,主要讲了列表和元组。
目录
序列是指按特定顺序依次排列的一组数据,它们可以占用一块连续的内存,也可以分散到多个内存中。
序列类型包括:字符串,列表,元组,字典和集合。
其中列表和元组比较相似,它们都按顺序保存元素,所有的元素占用一块连续的内存,每个元素都有自己的索引。它们的区别在于列表可以修改,而元组是不可修改的。
字典和集合存储的元素都是无序的,所以不能用索引或切片来访问它们内部的元素。
这些序列支持以下几种通用的操作,但比较特殊的是:集合和字典不支持索引,切片,相加和相乘的操作。
序列中,每个元素都有属于自己的编号(索引)。从起始元素开始,索引值从0开始递增。
除此之外,Python 还支持索引值是负数,此类索引是从右向左计数,换句话说,从最后一个元素开始计数,从索引值 -1 开始,如图 2 所示
无论是采用正索引值,还是负索引值,都可以访问序列中的任何元素。看下面的例子:
- str="天行健,君子以自强不息"
- print(str[2],"==",str[-9])
'运行
输出结果为:
切片操作是访问序列中元素的另一种方法,它可以访问一定范围内的元素,通过切片操作,可以生成一个新的序列。
序列实现切片操作语法格式如下:
sname[start:end:step]
其中,各个参数的含义分别是:
例如,对字符串“君子终日乾乾,夕惕若厉,无咎”进行切片
- str="君子终日乾乾,夕惕若厉,无咎"
- print(str[:2])#取索引区间为[0,2]之间(不包括索引2处的字符串)
- print(str[::2])#隔1个字符取一个字符,区间是整个字符串
- print(str[:])#取整个字符串,只需一个冒号即可
'运行
运行结果为:
Python中,支持两种类型相同的序列使用"+"运算符做相加操作,即将两个序列进行连接。所谓类型相同,指的是“+”运算符的两侧,要么都是列表,要么都是元组,要么都是字符串。
例如:
Python 中,使用数字 n 乘以一个序列会生成新的序列,其内容为原来序列被重复 n 次的结果。例如:
Python 中,可以使用 in 关键字检查某元素是否为序列的成员,其语法格式为:
value in sequence
其中,value 表示要检查的元素,sequence 表示指定的序列。
例如,检查字符‘c’是否包含在字符串“c.biancheng.net”中,可以执行如下代码:
- str="c.biancheng.net"
- print('c'in str)
'运行
运行结果为:Ture
和 in 关键字用法相同,但功能恰好相反的,还有 not in 关键字,它用来检查某个元素是否不包含在指定的序列中,比如说:
- str="c.biancheng.net"
- print('c' not in str)
'运行
输出结果为:False
函数 | 功能 |
---|---|
len() | 计算序列的长度,即返回序列中包含多少个元素。 |
max() | 找出序列中的最大元素。注意,对序列使用 sum() 函数时,做加和操作的必须都是数字,不能是字符或字符串,否则该函数将抛出异常,因为解释器无法判定是要做连接操作(+ 运算符可以连接两个序列),还是做加和操作。 |
min() | 找出序列中的最小元素。 |
list() | 将序列转换为列表。 |
str() | 将序列转换为字符串。 |
sum() | 计算元素和。 |
sorted() | 对元素进行排序。 |
reversed() | 反向序列中的元素。 |
enumerate() | 将序列组合为一个索引序列,多用在 for 循环中。 |
[element1, element2, element3, ..., elementn]
另外,我们经常用list来表示列表,这是因为列表的数据类型就是list,我们可以通过type()函数就可以知道,例如:
列表创建有两种方法,下面分别进行介绍
具体格式如下:
listname = [element1 , element2 , element3 , ... , elementn]
其中,listname 表示变量名,element1 ~ elementn 表示列表元素。
例如,下面定义的列表都是合法的:
- num = [1, 2, 3, 4, 5, 6, 7]
- name = ["C语言中文网", "http://c.biancheng.net"]
- program = ["C语言", "Python", "Java"]
另外,使用此方式创建列表时,列表中元素可以有多个,也可以一个都没有,例如:
emptylist = [ ]
这表明,emptylist 是一个空列表。
除了使用[ ]
创建列表外,Python 还提供了一个内置的函数 list(),使用它可以将其它数据类型转换为列表类型。例如:
- #将字符串转换成列表
- list1 = list("hello")
- print(list1)
- #将元组转换成列表
- tuple1 = ('Python', 'Java', 'C++', 'JavaScript')
- list2 = list(tuple1)
- print(list2)
- #将字典转换成列表
- dict1 = {'a':100, 'b':42, 'c':9}
- list3 = list(dict1)
- print(list3)
- #将区间转换成列表
- range1 = range(1, 6)
- list4 = list(range1)
- print(list4)
- #创建空列表
- print(list())
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
运行结果:
['h', 'e', 'l', 'l', 'o']
['Python', 'Java', 'C++', 'JavaScript']
['a', 'b', 'c']
[1, 2, 3, 4, 5]
[]
列表是 Python 序列的一种,我们可以使用索引(Index)访问列表中的某个元素(得到的是一个元素的值),也可以使用切片访问列表中的一组元素(得到的是一个新的子列表)。
使用索引访问列表元素的格式为:
listname[i]
其中,listname 表示列表名字,i 表示索引值。列表的索引可以是正数,也可以是负数。
使用切片访问列表元素的格式为:
listname[start : end : step]
其中,listname 表示列表名字,start 表示起始索引,end 表示结束索引,step 表示步长。
- url = list("http://c.biancheng.net/shell/")
- #使用索引访问列表中的某个元素
- print(url[3]) #使用正数索引
- print(url[-4]) #使用负数索引
- #使用切片访问列表中的一组元素
- print(url[9: 18]) #使用正数切片
- print(url[9: 18: 3]) #指定步长
- print(url[-6: -1]) #使用负数切片
运行结果:
p
e
['b', 'i', 'a', 'n', 'c', 'h', 'e', 'n', 'g']
['b', 'n', 'e']
['s', 'h', 'e', 'l', 'l']
对于已经创建的列表,如果不再使用,可以使用del
关键字将其删除。
实际开发中并不经常使用 del 来删除列表,因为 Python 自带的垃圾回收机制会自动销毁无用的列表,即使开发者不手动删除,Python 也会自动将其回收。
del 关键字的语法格式为:
del listname
其中,listname 表示要删除列表的名称。
Python 删除列表实例演示:
- intlist = [1, 45, 8, 34]
- print(intlist)
- del intlist
- print(intlist)
运行结果:
[1, 45, 8, 34]
Traceback (most recent call last):
File "C:\Users\mozhiyan\Desktop\demo.py", line 4, in <module>
print(intlist)
NameError: name 'intlist' is not defined
我们知道,可以使用+
运算符将多个序列连接起来;列表是序列的一种,所以也可以使用+
进行连接,这样就相当于在第一个列表的末尾添加了另一个列表。
请看下面演示:
- language = ["Python", "C++", "Java"]
- birthday = [1991, 1998, 1995]
- info = language + birthday
- print("language =", language)
- print("birthday =", birthday)
- print("info =", info)
运行结果:
language = ['Python', 'C++', 'Java']
birthday = [1991, 1998, 1995]
info = ['Python', 'C++', 'Java', 1991, 1998, 1995]
从运行结果可以发现,使用+
会生成一个新的列表,原有的列表不会被改变。+
更多的是用来拼接列表,而且执行效率并不高,如果想在列表中插入元素,应该使用下面几个专门的方法。
append() 方法用于在列表的末尾追加元素,该方法的语法格式如下:
listname.append(obj)
其中,listname 表示要添加元素的列表;obj 表示到添加到列表末尾的数据,它可以是单个元素,也可以是列表、元组等。
请看下面的演示:
- l = ['Python', 'C++', 'Java']
- #追加元素
- l.append('PHP')
- print(l)
- #追加元组,整个元组被当成一个元素
- t = ('JavaScript', 'C#', 'Go')
- l.append(t)
- print(l)
- #追加列表,整个列表也被当成一个元素
- l.append(['Ruby', 'SQL'])
- print(l)
运行结果为:
['Python', 'C++', 'Java', 'PHP']
['Python', 'C++', 'Java', 'PHP', ('JavaScript', 'C#', 'Go')]
['Python', 'C++', 'Java', 'PHP', ('JavaScript', 'C#', 'Go'), ['Ruby', 'SQL']]
可以看到,当给 append() 方法传递列表或者元组时,此方法会将它们视为一个整体,作为一个元素添加到列表中,从而形成包含列表和元组的新列表。
extend() 和 append() 的不同之处在于:extend() 不会把列表或者元祖视为一个整体,而是把它们包含的元素逐个添加到列表中。
extend() 方法的语法格式如下:
listname.extend(obj)
其中,listname 指的是要添加元素的列表;obj 表示到添加到列表末尾的数据,它可以是单个元素,也可以是列表、元组等,但不能是单个的数字。
请看下面的演示:
- l = ['Python', 'C++', 'Java']
- #追加元素
- l.extend('C')
- print(l)
- #追加元组,元祖被拆分成多个元素
- t = ('JavaScript', 'C#', 'Go')
- l.extend(t)
- print(l)
- #追加列表,列表也被拆分成多个元素
- l.extend(['Ruby', 'SQL'])
- print(l)
运行结果:
['Python', 'C++', 'Java', 'C']
['Python', 'C++', 'Java', 'C', 'JavaScript', 'C#', 'Go']
['Python', 'C++', 'Java', 'C', 'JavaScript', 'C#', 'Go', 'Ruby', 'SQL']
append() 和 extend() 方法只能在列表末尾插入元素,如果希望在列表中间某个位置插入元素,那么可以使用 insert() 方法。
insert() 的语法格式如下:
listname.insert(index , obj)
其中,index 表示指定位置的索引值。insert() 会将 obj 插入到 listname 列表第 index 个元素的位置。
当插入列表或者元祖时,insert() 也会将它们视为一个整体,作为一个元素插入到列表中,这一点和 append() 是一样的。
请看下面的演示代码:
- l = ['Python', 'C++', 'Java']
- #插入元素
- l.insert(1, 'C')
- print(l)
- #插入元组,整个元祖被当成一个元素
- t = ('C#', 'Go')
- l.insert(2, t)
- print(l)
- #插入列表,整个列表被当成一个元素
- l.insert(3, ['Ruby', 'SQL'])
- print(l)
- #插入字符串,整个字符串被当成一个元素
- l.insert(0, "http://c.biancheng.net")
- print(l)
输出结果为:
['Python', 'C', 'C++', 'Java']
['Python', 'C', ('C#', 'Go'), 'C++', 'Java']
['Python', 'C', ('C#', 'Go'), ['Ruby', 'SQL'], 'C++', 'Java']
['http://c.biancheng.net', 'Python', 'C', ('C#', 'Go'), ['Ruby', 'SQL'], 'C++', 'Java']
提示,insert() 主要用来在列表的中间位置插入元素,如果你仅仅希望在列表的末尾追加元素,那我更建议使用 append() 和 extend()。
在 Python 列表中删除元素主要分为以下 3 种场景:
del 是 Python 中的关键字,专门用来执行删除操作,它不仅可以删除整个列表,还可以删除列表中的某些元素。
del 删除列表中的单个元素的格式为:
del listname[index]
其中,listname 表示列表名称,index 表示元素的索引值。
del 也可以删除中间一段连续的元素,格式为:
del listname[start : end]
其中,start 表示起始索引,end 表示结束索引。del 会删除从索引 start 到 end 之间的元素,不包括 end 位置的元素。
【示例】使用 del 删除单个列表元素:
- lang = ["Python", "C++", "Java", "PHP", "Ruby", "MATLAB"]
- #使用正数索引
- del lang[2]
- print(lang)
- #使用负数索引
- del lang[-2]
- print(lang)
'运行
运行结果:
['Python', 'C++', 'PHP', 'Ruby', 'MATLAB']
['Python', 'C++', 'PHP', 'MATLAB']
【示例】使用 del 删除一段连续的元素:
- lang = ["Python", "C++", "Java", "PHP", "Ruby", "MATLAB"]
- del lang[1: 4]
- print(lang)
- lang.extend(["SQL", "C#", "Go"])
- del lang[-5: -2]
- print(lang)
运行结果:
['Python', 'Ruby', 'MATLAB']
['Python', 'C#', 'Go']
Python pop() 方法用来删除列表中指定索引处的元素,具体格式如下:
listname.pop(index)
其中,listname 表示列表名称,index 表示索引值。如果不写 index 参数,默认会删除列表中的最后一个元素,类似于数据结构中的“出栈”操作。
pop() 用法举例:
- nums = [40, 36, 89, 2, 36, 100, 7]
- nums.pop(3)
- print(nums)
- nums.pop()
- print(nums)
运行结果:
[40, 36, 89, 36, 100, 7]
[40, 36, 89, 36, 100]
大部分编程语言都会提供和 pop() 相对应的方法,就是 push(),该方法用来将元素添加到列表的尾部,类似于数据结构中的“入栈”操作。但是 Python 是个例外,Python 并没有提供 push() 方法,因为完全可以使用 append() 来代替 push() 的功能
除了 del 关键字,Python 还提供了 remove() 方法,该方法会根据元素本身的值来进行删除操作。
需要注意的是,remove() 方法只会删除第一个和指定值相同的元素,而且必须保证该元素是存在的,否则会引发 ValueError 错误。
remove() 方法使用示例:
- nums = [40, 36, 89, 2, 36, 100, 7]
- #第一次删除36
- nums.remove(36)
- print(nums)
- #第二次删除36
- nums.remove(36)
- print(nums)
- #删除78
- nums.remove(78)
- print(nums)
运行结果:
[40, 89, 2, 36, 100, 7]
[40, 89, 2, 100, 7]
Traceback (most recent call last):
File "C:\Users\mozhiyan\Desktop\demo.py", line 9, in <module>
nums.remove(78)
ValueError: list.remove(x): x not in list
最后一次删除,因为 78 不存在导致报错,所以我们在使用 remove() 删除元素时最好提前判断一下。
Python clear() 用来删除列表的所有元素,也即清空列表,请看下面的代码:
- url = list("http://c.biancheng.net/python/")
- url.clear()
- print(url)
运行结果:
[ ]
Python 提供了两种修改列表(list)元素的方法,你可以每次修改单个元素,也可以每次修改一组元素(多个)
修改单个元素非常简单,直接对元素赋值即可。请看下面的例子:
- nums = [40, 36, 89, 2, 36, 100, 7]
- nums[2] = -26 #使用正数索引
- nums[-3] = -66.2 #使用负数索引
- print(nums)
运行结果:
[40, 36, -26, 2, -66.2, 100, 7]
使用索引得到列表元素后,通过=
赋值就改变了元素的值
Python 支持通过切片语法给一组元素赋值。在进行这种操作时,如果不指定步长(step 参数),Python 就不要求新赋值的元素个数与原来的元素个数相同;这意味,该操作既可以为列表添加元素,也可以为列表删除元素。
下面的代码演示了如何修改一组元素的值:
- nums = [40, 36, 89, 2, 36, 100, 7]
- #修改第 1~4 个元素的值(不包括第4个元素)
- nums[1: 4] = [45.25, -77, -52.5]
- print(nums)
运行结果:
[40, 45.25, -77, -52.5, 36, 100, 7]
如果对空切片(slice)赋值,就相当于插入一组新的元素:
- nums = [40, 36, 89, 2, 36, 100, 7]
- #在4个位置插入元素
- nums[4: 4] = [-77, -52.5, 999]
- print(nums)
运行结果:
[40, 36, 89, 2, -77, -52.5, 999, 36, 100, 7]
使用切片语法赋值时,Python 不支持单个值,例如下面的写法就是错误的:
nums[4: 4] = -77
但是如果使用字符串赋值,Python 会自动把字符串转换成序列,其中的每个字符都是一个元素,请看下面的代码:
- s = list("Hello")
- s[2:4] = "XYZ"
- print(s)
运行结果:
['H', 'e', 'X', 'Y', 'Z', 'o']
使用切片语法时也可以指定步长(step 参数),但这个时候就要求所赋值的新元素的个数与原有元素的个数相同,例如:
- nums = [40, 36, 89, 2, 36, 100, 7]
- #步长为2,为第1、3、5个元素赋值
- nums[1: 6: 2] = [0.025, -99, 20.5]
- print(nums)
运行结果:
[40, 0.025, 89, -99, 36, 20.5, 7]
Python列表提供了index()和count()的方法,它们都可以用来查找元素。
index() 方法用来查找某个元素在列表中出现的位置(也就是索引),如果该元素不存在,则会导致 ValueError 错误,所以在查找之前最好使用 count() 方法判断一下。
index() 的语法格式为:
listname.index(obj, start, end)
其中,listname 表示列表名称,obj 表示要查找的元素,start 表示起始位置,end 表示结束位置。
start 和 end 参数用来指定检索范围:
index() 方法会返回元素所在列表中的索引值。
index() 方法使用举例:
- nums = [40, 36, 89, 2, 36, 100, 7, -20.5, -999]
- #检索列表中的所有元素
- print( nums.index(2) )
- #检索3~7之间的元素
- print( nums.index(100, 3, 7) )
- #检索4之后的元素
- print( nums.index(7, 4) )
- #检索一个不存在的元素
- print( nums.index(55) )
运行结果:
3
5
6
Traceback (most recent call last):
File "C:\Users\mozhiyan\Desktop\demo.py", line 9, in <module>
print( nums.index(55) )
ValueError: 55 is not in list
count() 方法用来统计某个元素在列表中出现的次数,基本语法格式为:
listname.count(obj)
其中,listname 代表列表名,obj 表示要统计的元素。
如果 count() 返回 0,就表示列表中不存在该元素,所以 count() 也可以用来判断列表中的某个元素是否存在。
count() 用法示例:
- nums = [40, 36, 89, 2, 36, 100, 7, -20.5, 36]
- #统计元素出现的次数
- print("36出现了%d次" % nums.count(36))
- #判断一个元素是否存在
- if nums.count(100):
- print("列表中存在100这个元素")
- else:
- print("列表中不存在100这个元素")
运行结果:
36出现了3次
列表中存在100这个元素
元组(tuple)是 Python 中另一个重要的序列结构,和列表类似,元组也是由一系列按特定顺序排序的元素组成。
元组和列表(list)的不同之处在于:
元组也可以看做是不可变的列表,通常情况下,元组用于保存无需修改的内容。
从形式上看,元组的所有元素都放在一对小括号( )
中,相邻元素之间用逗号,
分隔,如下所示:
(element1, element2, ... , elementn)
其中 element1~elementn 表示元组中的各个元素,个数没有限制,只要是 Python 支持的数据类型就可以。
从存储内容上看,元组可以存储整数、实数、字符串、列表、元组等任何类型的数据,并且在同一个元组中,元素的类型可以不同,例如:
("c.biancheng.net", 1, [2,'a'], ("abc",3.0))
在这个元组中,有多种类型的数据,包括整形、字符串、列表、元组。
另外,我们都知道,列表的数据类型是 list,那么元组的数据类型是什么呢?我们不妨通过 type() 函数来查看一下:
>>> type( ("c.biancheng.net",1,[2,'a'],("abc",3.0)) )
<class 'tuple'>
可以看到,元组是 tuple 类型,这也是很多教程中用 tuple 指代元组的原因。
Python 提供了两种创建元组的方法,下面一一进行介绍。
通过( )
创建元组后,一般使用=
将它赋值给某个变量,具体格式为:
tuplename = (element1, element2, ..., elementn)
其中,tuplename 表示变量名,element1 ~ elementn 表示元组的元素。
例如,下面的元组都是合法的:
- num = (7, 14, 21, 28, 35)
- course = ("Python教程", "http://c.biancheng.net/python/")
- abc = ( "Python", 19, [1,2], ('c',2.0) )
在 Python 中,元组通常都是使用一对小括号将所有元素包围起来的,但小括号不是必须的,只要将各元素用逗号隔开,Python 就会将其视为元组,请看下面的例子:
- course = "Python教程", "http://c.biancheng.net/python/"
- print(course)
运行结果为:
('Python教程', 'http://c.biancheng.net/python/')
需要注意的一点是,当创建的元组中只有一个字符串类型的元素时,该元素后面必须要加一个逗号,
,否则 Python 解释器会将它视为字符串。请看下面的代码:
- #最后加上逗号
- a =("http://c.biancheng.net/cplus/",)
- print(type(a))
- print(a)
- #最后不加逗号
- b = ("http://c.biancheng.net/socket/")
- print(type(b))
- print(b)
运行结果为:
<class 'tuple'>
('http://c.biancheng.net/cplus/',)
<class 'str'>
http://c.biancheng.net/socket/
你看,只有变量 a 才是元组,后面的变量 b 是一个字符串。
除了使用( )
创建元组外,Python 还提供了一个内置的函数 tuple(),用来将其它数据类型转换为元组类型。
tuple() 的语法格式如下:
tuple(data)
其中,data 表示可以转化为元组的数据,包括字符串、元组、range 对象等。
tuple() 使用示例:
- #将字符串转换成元组
- tup1 = tuple("hello")
- print(tup1)
- #将列表转换成元组
- list1 = ['Python', 'Java', 'C++', 'JavaScript']
- tup2 = tuple(list1)
- print(tup2)
- #将字典转换成元组
- dict1 = {'a':100, 'b':42, 'c':9}
- tup3 = tuple(dict1)
- print(tup3)
- #将区间转换成元组
- range1 = range(1, 6)
- tup4 = tuple(range1)
- print(tup4)
- #创建空元组
- print(tuple())
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
运行结果为:
('h', 'e', 'l', 'l', 'o')
('Python', 'Java', 'C++', 'JavaScript')
('a', 'b', 'c')
(1, 2, 3, 4, 5)
()
和列表一样,我们可以使用索引(Index)访问元组中的某个元素(得到的是一个元素的值),也可以使用切片访问元组中的一组元素(得到的是一个新的子元组)。
使用索引访问元组元素的格式为:
tuplename[i]
其中,tuplename 表示元组名字,i 表示索引值。元组的索引可以是正数,也可以是负数。
使用切片访问元组元素的格式为:
tuplename[start : end : step]
其中,start 表示起始索引,end 表示结束索引,step 表示步长。
- url = tuple("http://c.biancheng.net/shell/")
- #使用索引访问元组中的某个元素
- print(url[3]) #使用正数索引
- print(url[-4]) #使用负数索引
- #使用切片访问元组中的一组元素
- print(url[9: 18]) #使用正数切片
- print(url[9: 18: 3]) #指定步长
- print(url[-6: -1]) #使用负数切片
'运行
运行结果:
p
e
('b', 'i', 'a', 'n', 'c', 'h', 'e', 'n', 'g')
('b', 'n', 'e')
('s', 'h', 'e', 'l', 'l')
前面我们已经说过,元组是不可变序列,元组中的元素不能被修改,所以我们只能创建一个新的元组去替代旧的元组。
例如,对元组变量进行重新赋值:
- tup = (100, 0.5, -36, 73)
- print(tup)
- #对元组进行重新赋值
- tup = ('Shell脚本',"http://c.biancheng.net/shell/")
- print(tup)
运行结果为:
(100, 0.5, -36, 73)
('Shell脚本', 'http://c.biancheng.net/shell/')
另外,还可以通过连接多个元组(使用+
可以拼接元组)的方式向元组中添加新元素,例如
- tup1 = (100, 0.5, -36, 73)
- tup2 = (3+12j, -54.6, 99)
- print(tup1+tup2)
- print(tup1)
- print(tup2)
运行结果为:
(100, 0.5, -36, 73, (3+12j), -54.6, 99)
(100, 0.5, -36, 73)
((3+12j), -54.6, 99)
你看,使用+
拼接元组以后,tup1 和 tup2 的内容没法发生改变,这说明生成的是一个新的元组
当创建的元组不再使用时,可以通过 del 关键字将其删除,例如:
- tup = ('Java教程',"http://c.biancheng.net/java/")
- print(tup)
- del tup
- print(tup)
运行结果为:
('Java教程', 'http://c.biancheng.net/java/')
Traceback (most recent call last):
File "C:\Users\mozhiyan\Desktop\demo.py", line 4, in <module>
print(tup)
NameError: name 'tup' is not defined
Python 自带垃圾回收功能,会自动销毁不用的元组,所以一般不需要通过 del 来手动删除
下一篇: Python基本数据结构详解(列表,元组,字典,集合) 下
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。