一、基础
- 列表的数据项不需要具有相同的类型 -->里面数据项地址不一定会相邻
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不可拷贝)
参考资料:
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])) # 浅、深拷贝两个地址均不同
深、浅拷贝只针对于列表中的列表
当改变一个列表中的一个数字时,
深、浅拷贝均不影响另一个列表的数字