一、基础
-
列表的数据项不需要具有相同的类型 -->里面数据项地址不一定会相邻
list01=[1,2,3,'hello'] print(id(list01)) # 1833720636040 print(id(list01[0])) # 140704119612048 print(id(list01[1])) # 140704119612080 print(id(list01[2])) # 140704119612112 print(id(list01[3])) # 1833721071576
-
List(列表) 是 Python 中使用最频繁的数据类型。
-
列表可以完成大多数集合类的数据结构实现。它支持字符,数字,字符串甚至可以包含列表(即嵌套)。
-
列表形式:list01 = [1, 2, ‘hello’, 4]
-
列表不是链表,因为list是保存到其内容对应的地址,链表是直接连接
-
列表为可变对象
list01=[1,3,5,7,9] list01[0]=10 print(list01)
-
列表切片
列表中值的切割也可以用到变量 [头下标:尾下标] ,就可以截取相应的列表
从左到右索引默认 0 开始,从右到左索引默认 -1开始
加号 + 是列表连接运算符,星号 * 是重复操作。list=[1,3,5,7,9,11] list # 输出完整列表 list[0] # 输出列表的第一个元素 list[-1] # 输出列表的最后一个元素 list[1:3] # 输出第二个至第三个元素 list[2:] # 输出从第三个开始至列表末尾的所有元素 list[::2] # 步长为2 list[::-1] # 反转数组 list[-1:-3:-1] # 从后往前截取 list * 2 # 输出列表两次 list + tinylist # 打印组合的列表 for item in range(len(arr)): print(arr(item)) for item in arr: print(item)
二、list 操作
fruits = ['orange', 'apple', 'pear', 'banana']
-
count():统计
print (fruits.count('apple'))
-
index():找到为位置,找不到为异常,判断是否存在
fruits=['orange','apple','pear','banana'] if 'apple' in fruits: # 用in解决异常 index=fruits.index('apple') print(index) #demo--模糊搜索 fuits = ['orange', 'apple', 'pear', 'banana','apples','big apple'] condition='app' res=[] for f in fruits: if condition in f: res.append(f) print(res)
-
reverse():反转
fruits=['orange','apple','pear','banana'] fruits.reverse() print(fruits) # ['banana', 'pear', 'apple', 'orange']
-
排序sort()
list01=[1,20,3,4] list01.sort() # 默认从小到大 print(list01) # [1, 3, 4, 20] list01.sort(reverse=True)#从大到小 print(list01) # [20, 4, 3, 1] print(list01.sort()) #sort.()返回值为None
-
增加 增加元素:append() ,增加集合:extend() +连接
增加元素append():地址不变
增加集合extend([]):地址不变,相当于list0+list1的结果
增加集合+[]连接:地址改变f0 = ['apple','orange','banana','pear'] print('原列表:','地址为:',id(f0),f0) # 原列表: 地址为: 2818495219208 ['apple', 'orange', 'banana', 'pear'] f0.append('append') print('append增加元素后:','地址为:',id(f0),f0) # append增加元素后: 地址为: 2818495219208 ['apple', 'orange', 'banana', 'pear', 'append'] f0.extend(['extend']) print('extend增加集合后:','地址为:',id(f0),f0) # extend增加集合后: 地址为: 2818495219208 ['apple', 'orange', 'banana', 'pear', 'append', 'extend'] f1 = f0 + ['+连接'] print('+连接后:','地址为:',id(f1),f1) # +连接后: 地址为: 2818495525064 ['apple', 'orange', 'banana', 'pear', 'append', 'extend', '+连接']
-
合并两个列表
new_fruits=fruits+['kiwi','water']
-
插入元素 insert()
fruits = ['apple','pear'] fruits.insert(1,'pick') print(fruits) # ['apple', 'pick', 'pear']
-
删除元素 pop(index) ,remove(list[index]) ,del, [:]=[]
pop(i):i为空时,默认删除最后一个,为i时,删除下标为i的
pop()比remove()效率高
remove(a):在列表中找不到a时,则停止执行fruits0 = ['apple','pear','orange'] fruits0.pop(2) # ['apple', 'pear'] print(fruits0) fruits = ['apple','pear','orange'] fruits.remove('apple') print(fruits) # ['pear', 'orange'] fruits.remove(fruits[1]) print(fruits) # ['pear'] fruits1 = ['apple','pear','orange','banana','watermelon'] del fruits1[1] #del回收内存 print(fruits1) # ['apple', 'orange', 'banana', 'watermelon'] fruits1[1:3]=[] print(fruits1) # ['apple', 'watermelon']
-
清空元素
fruits = ['apple','pear','orange','banana','watermelon'] fruits=[] fruits[:]=[] fruits.clear() # 第三个更好 del fruits[:] #不同于del fruits
-
最大最小值
list01=[1,2,3,4] print(max(list01)) # 4 print(min(list01)) # 1 print(sum(list01)) # 10
三、多维列表
-
多维列表的访问和遍历
print('多维列表:') list01=[[1,2],[3,4],[5,6]] list02=[10,20,[100,200]] print(list02[2][1]) # 200 for i in list01: for j in i: # 这样循环list02会停止 print(j)
-
demo–找最长的单词
def LogestWord(sen): words=''.join(([',',c][ int(c.isalpha())]for c in sen )).split(',') # 1为c,0为, maxLen=max(len(i) for i in words ) return [i for i in words if len(i)==maxLen][0] print(LogestWord('fun! times 7643579')) # times
四、list去重
-
方法一:新建新列表list
-
方法二:(删除前面所有与后面元素相同的元素)
list01=[1,2,2,2,3,4,2,5,4,2] le=len(list01) i=0 while i<le-1: j=i+1 while j<le: if list01[i]==list01[j]: list01.remove(list01[i]) le-=1 i-=1 break j+=1 i+=1 print(list01)
-
方法三:(删除后面所有与当前元素相同的元素)
list01=[1,2,2,2,3,4,2,5,4,2] le=len(list01) i=0 while i<le-1: j=i+1 while j<le: if list01[i]==list01[j]: list01.pop(j) le-=1 j-=1 j+=1 i+=1 print(list01)
五、list拷贝
列表可以拷贝,即拷贝完后两地址不同(string不可拷贝)
参考资料:https://www.cnblogs.com/pyramid1001/p/5844905.html
import copy
list01 = [1, 3, 5, 7, 9]
list02 = list01 # 不是拷贝,传引用/地址,id(list01) == id(list02)
list03 = list01[:] # 浅拷贝,id(list03) != id(list01)
list04 = list01.copy() # 浅拷贝,id(list04) != id(list01)
list05 = copy.copy(list01) # 浅拷贝,id(list05) != id(list01)
list06 = copy.deepcopy(list01) # 深拷贝,id(list06) != id(list01)
深、浅拷贝对列表的影响:
import copy
list01=[10,20,[100,200]]
list02=list01.copy() #浅拷贝 list[:] copy.copy(list) list.copy()
list02=copy.deepcopy(list01) #深拷贝 copy.deepcopy()
print(id(list01[0]),id(list02[0])) # 深、浅拷贝两个地址相同
print(id(list01[2]),id(list02[2])) # 浅拷贝两个地址相同,深拷贝两个地址不同
list01[2][0]=1000
print(list01)
print(list02) # 浅拷贝变为1000,深拷贝不变
print(id(list01[2]),id(list02[2])) # 浅拷贝两个地址相同,深拷贝两个地址不同
list01[0]=50
print(list01)
print(list02) # 浅拷贝、深拷贝均不变
print(id(list01[0]),id(list02[0])) # 浅、深拷贝两个地址均不同
深、浅拷贝只针对于列表中的列表
当改变一个列表中的一个数字时,
深、浅拷贝均不影响另一个列表的数字