【python】list列表
一、列表的概念
Python 中没有数组,
但是加入了更加强大的列表。如果把数组看做是一个集装箱,那么 Python 的列表就是一个工厂的仓库。
列表会将所有元素都放在一对中括号[ ]
里面,相邻元素之间用逗号,
分隔,如下所示:
[element1, element2, element3, ..., elementn]
格式中,
- element1 ~ elementn 表示列表中的元素,个数没有限制,只要是 Python 支持的数据类型就可以。
- 同一个列表中元素的类型也可以不同,但一般不这么使用
>>> type( ["http://c.biancheng.net/python/", 1, [2,3,4] , 3.0] ) <class 'list'>
二、Python创建列表
1) 使用 [ ] 直接创建列表
使用[ ]
创建列表后,一般使用=
将它赋值给某个变量,具体格式如下:
listname = [element1 , element2 , element3 , ... , elementn]
#emptylist 是一个空列表。
emptylist = [ ]
其中,listname 表示变量名,element1 ~ elementn 表示列表元素。
num = [1, 2, 3, 4, 5, 6, 7] name = ["C语言中文网", "http://c.biancheng.net"] program = ["C语言", "Python", "Java"]
2) 使用 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())
//运行结果
['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']
四、Python删除列表
对于已经创建的列表,如果不再使用,可以使用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
五、Python列表添加元素
5.1、基于“+”添加元素
《Python序列》一节告诉我们,使用+
运算符可以将多个序列连接起来;列表是序列的一种,所以也可以使用+
进行连接,这样就相当于在第一个列表的末尾添加了另一个列表。
使用+
会生成一个新的列表,原有的列表不会被改变。
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]
5.2、Python append()方法添加元素
append() 方法用于在列表的末尾追加元素,该方法的语法格式如下:
listname.append(obj)
其中,listname 表示要添加元素的列表;obj 表示到添加到列表末尾的数据,它可以是单个元素,也可以是列表、元组等。
请看下面的演示:
可以看到,当给 append() 方法传递列表或者元组时,此方法会将它们视为一个整体,作为一个元素添加到列表中,从而形成包含列表和元组的新列表。
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']]
5.3、Python extend()方法添加元素
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']
5.4、Python insert()方法插入元素
append() 和 extend() 方法只能在列表末尾插入元素,如果希望在列表中间某个位置插入元素,那么可以使用 insert() 方法。
insert() 的语法格式如下:
listname.insert(index , obj)
其中,index 表示指定位置的索引值。insert() 会将 obj 插入到 listname 列表第 index 个元素的位置。
当插入列表或者元祖时,insert() 也会将它们视为一个整体,作为一个元素插入到列表中,这一点和 append() 是一样的。
提示,insert() 主要用来在列表的中间位置插入元素,如果你仅仅希望在列表的末尾追加元素,那我更建议使用 append() 和 extend()。
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']
六、Python列表删除元素
在 Python 列表中删除元素主要分为以下 3 种场景:
- 根据目标元素所在位置的索引进行删除,可以使用 del 关键字或者 pop() 方法;
- 根据元素本身的值进行删除,可使用列表(list类型)提供的 remove() 方法;
- 将列表中所有元素全部删除,可使用列表(list类型)提供的 clear() 方法。
6.1、del:根据索引值删除元素
del 是 Python 中的关键字,专门用来执行删除操作,它不仅可以删除整个列表,还可以删除列表中的某些元素。我们已经在《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']
#使用列表删除一段元素 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']
6.2、pop():根据索引值删除元素
Python pop() 方法用来删除列表中指定索引处的元素,具体格式如下:
listname.pop(index)
其中,listname 表示列表名称,index 表示索引值。如果不写 index 参数,默认会删除列表中的最后一个元素,类似于数据结构中的“出栈”操作。
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() 的功能。
6.3、remove():根据元素值进行删除
除了 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() 删除元素时最好提前判断一下。
6.4、clear():删除列表所有元素
Python clear() 用来删除列表的所有元素,也即清空列表,请看下面的代码:
url = list("http://c.biancheng.net/python/") url.clear() print(url)
//运行结果:
[]
七、Python列表修改元素
Python 提供了两种修改列表(list)元素的方法,
你可以
- 每次修改单个元素,
- 可以每次修改一组元素(多个)。
7.1、修改单个元素
修改单个元素非常简单,直接对元素赋值即可。请看下面的例子:
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]
使用索引得到列表元素后,通过=
赋值就改变了元素的值。
7.2、修改一组元素
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 list列表查找元素
Python 列表(list)提供了 index() 和 count() 方法,它们都可以用来查找元素。
8.1、index() 方法
index() 方法用来查找某个元素在列表中出现的位置(也就是索引),如果该元素不存在,则会导致 ValueError 错误,所以在查找之前最好使用 count() 方法判断一下。
index() 的语法格式为:
listname.index(obj, start, end)
其中,listname 表示列表名称,obj 表示要查找的元素,start 表示起始位置,end 表示结束位置。
start 和 end 参数用来指定检索范围:
- start 和 end 可以都不写,此时会检索整个列表;
- 如果只写 start 不写 end,那么表示检索从 start 到末尾的元素;
- 如果 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
8.2、count()方法
listname.count(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这个元素
九、Python range()快速初始化数字列表
Python range() 函数能够轻松地生成一系列的数字。例如,可以像如下这样使用 range() 来打印一系列数字:
for value in range(1,5): print(value)
输出结果为:
1
2
3
4
注意,在这个示例程序中,range() 只是打印数字 1~4,因为range() 函数的用法是:让 Python 从指定的第一个值开始,一直数到指定的第二个值停止,但不包含第二个值(这里为 5)。
>>> type([1,2,3,4,5]) <class 'list'> >>> type(range(1,6)) <class 'range'> >>> list(range(1,6)) [1, 2, 3, 4, 5]
可以看到,如果将 range() 作为 list() 的参数,其输出就是一个数字列表。
不仅如此,在使用 range() 函数时,还可以指定步长。例如,下面的代码打印 1~10 内的偶数:
even_numbers = list(range(2,11,2)) print(even_numbers)
在这个示例中,函数 range() 从 2 开始数,然后不断地加 2,直到达到或超过终值,因此输出如下:
[2, 4, 6, 8, 10]
注意,即便 range() 第二个参数恰好符合条件,最终创建的数字列表中也不会包含它。
十、Python list列表实现栈和队列
- 队列是,先存入的数据最先取出,即“先进先出”。
- 栈是,最后存入的数据最先取出,即“后进先出”。
10.1、对列
考虑到 list 类型数据本身的存放就是有顺序的,而且内部元素又可以是各不相同的类型,非常适合用于队列和栈的实现。本节将演示如何使用 list 类型变量来实现队列和栈。#定义一个空列表,当做队列 queue = [] #向列表中插入元素 queue.insert(0,1) queue.insert(0,2) queue.insert(0,"hello") print(queue) print("取一个元素:",queue.pop()) print("取一个元素:",queue.pop()) print("取一个元素:",queue.pop())
//运行结果
['hello', 2, 1]
取一个元素: 1
取一个元素: 2
取一个元素: hello
10.2、栈
使用 list 列表模拟栈功能的实现方法是,使用 append() 方法存入数据;使用 pop() 方法读取数据。
append() 方法向 list 中存入数据时,每次都在最后面添加数据,这和前面程序中的 insert() 方法正好相反。
举个例子:
#定义一个空 list 当做栈 stack = [] stack.append(1) stack.append(2) stack.append("hello") print(stack) print("取一个元素:",stack.pop()) print("取一个元素:",stack.pop()) print("取一个元素:",stack.pop())
输出结果为:
[1, 2, 'hello']
取一个元素: hello
取一个元素: 2
取一个元素: 1
collections模块实现栈和队列
前面使用 list 实现队列的例子中,插入数据的部分是通过 insert() 方法实现的,这种方法效率并不高,因为每次从列表的开头插入一个数据,列表中所有元素都得向后移动一个位置。
这里介绍一个相对更高效的方法,即使用标准库的 collections 模块中的 deque 结构体,它被设计成在两端存入和读取都很快的特殊 list,可以用来实现栈和队列的功能。
import collections queueAndStack = collections.deque() queueAndStack.append(1) queueAndStack.append(2) queueAndStack.append("hello") print(list(queueAndStack)) #实现队列功能,从队列中取一个元素,根据先进先出原则,这里应输出 1 print(queueAndStack.popleft()) #实现栈功能,从栈里取一个元素,根据后进先出原则,这里应输出 hello print(queueAndStack.pop()) #再次打印列表 print(list(queueAndStack)) //运行结果 [1, 2, 'hello'] 1 hello [2]