DataWhale-Python基础-4.列表
接下来我们将学习Python的容器数据类型,今天学习的内容是列表。
1.列表的定义
列表是有序集合,没有固定大小,能保存任意数量任意类型的Python对象。
2.列表的创建
#直接创建
x = [1,2,3,4]
print(x,type(x))
#[1, 2, 3, 4] <class 'list'>
#利用range创建
x = list(range(10))
print(x,type(x))
#[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] <class 'list'>
#利用推导式创建
x = [i for i in range(5)]
print(x,type(x))
#[0, 1, 2, 3, 4] <class 'list'>
#创建二维数组
x = [[i for i in range(3)] for j in range(4)]
print(x,type(x))
[[0, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2]] <class 'list'>
3.向列表中添加元素
3.1append
append是在列表末尾添加新的对象,只接受一个参数,这个参数可以为任意类型,被追加的元素在list中保持原结构类型。
#append的例子
x = [1,2,3,4]
x.append(5)
x
#[1,2,3,4,5]
x.append([4,5])
x
#[1,2,3,4,5,[4,5]]
3.2extend
append代表追加,extend则代表扩展,把一个东西里的所有元素都逐个添加到链表后面。
x = [1,2,3,4]
x.extend([4,5])
x
#[1,2,3,4,4,5]
3.3 insert
- list.insert(index,obj):insert操作是在index位置插入obj。
x = [1,2,3,4]
x.insert(1,2)
x
#[1,2,2,3,4]
4.删除列表中的元素
- list.remove(obj):移除列表中obj的第一个匹配项。
- list.pop([index = -1]):pop默认删除列表最后一项,可以改变index来改变删除的对象。
- del:pop和remove都是删除元素,del可以删除单个或多个对象。
#remove例子
x = [1,2,3,4]
x.remove(1)
x
#[2,3,4]
#pop的例子
x.pop()
x
#[2,3]
x.pop(0)
x
#[3]
#del的例子
x = [1,2,3,4]
del x[0:2]
x
#[3,4]
5.获取列表中的元素
- 直接list[index],若index为正数,则就是index位置的值,从0开始;如果是负数则代表从最后往前,例如index = -1时代表倒数第一个值。
x = [1,2,3,4]
x[0]
# 1
x[-1]
# 4
- 切片通用写法:list[start:stop:step]
x = [1,2,3,4]
x[:] # [1,2,3,4]
x [:2] # [1,2,3]
x[1:] # [2,3,4]
x[1:3] # [2,3]
深拷贝与浅拷贝
- 所谓“浅拷贝”,是指创建一个新的对象,其内容是原对象中元素的引用
- 所谓“深拷贝”,是指创建一个新的对象,然后递归的拷贝原对象所包含的子对象。深拷贝出来的对象与原对象没有任何关联。
list1 = [123, 456, 789, 213]
list2 = list1
list3 = list1[:]
print(list2) # [123, 456, 789, 213]
print(list3) # [123, 456, 789, 213]
list1.sort()
print(list2) # [123, 213, 456, 789]
print(list3) # [123, 456, 789, 213]
6.列表的常用操作符
操作符 | 作用 | 例子 |
---|---|---|
== | 等号 | list1 == list2 |
+ | 拼接 | list1 + list2 |
* | 重复 | list1 * 3 |
in | 判断是否在列表中 | obj in list1 |
not in | 判断是否不在列表中 | obj not in list1 |
list1 = [1,2,3]
list2 = [2,3,4]
list3 = [1,2,3]
# ==
list1 == list2 # False
list1 == list3 # True
# +
lis1 + list2
# [1,2,3,2,3,4]
# *
list1 * 3
[1,2,3,1,2,3,1,2,3]
# in & not in
1 in list1 # True
3 not in list1 # False
7.列表的其他方法
- list.count(obj) : 统计某个元素在列表中出现的次数
- list.index(x[, start[,end]]):从列表中找出某个值第一个匹配项的索引位置。
- list.reverse():反向列表中的元素
- list.sort(key = None, reverse = False):对原列表元素进行排序。这里的key主要用来进行比较的元素;reverse则是排序规则,True代表降序,False代表升序。sort方法没有返回值,只会对列表的对象排序。
练习题
1、列表操作练习
列表lst 内容如下
lst = [2, 5, 6, 7, 8, 9, 2, 9, 9]
请写程序完成下列操作:
在列表的末尾增加元素15
在列表的中间位置插入元素20
将列表[2, 5, 6]合并到lst中
移除列表中索引为3的元素
翻转列表里的所有元素
对列表里的元素进行排序,从小到大一次,从大到小一次
lst = [2,5,6,7,8,9,2,9,9]
lst.append(15) #列表末尾插入15
lst.insert(len(lst)//2,20) #中间位置插入20
lst.extend([2,5,6]) #将[2,5,6]扩展到lst中
lst.pop(3) #移除index = 3 的元素
lst.reverse() #翻转
lst.sort(reverse=True) #从大到小排序
lst.sort(reverse=False) #从小到大排序
2、修改列表
问题描述:
lst = [1, [4, 6], True]
请将列表里所有数字修改成原来的两倍
for i in range(len(lst2)):
if type(lst2[i]) == int:
lst2[i] = lst2[i] * 2
print(lst2[i])
elif type(lst2[i]) == list:
for j in range(len(lst2[i])):
if type(lst2[i][j]) == int:
lst2[i][j] *= 2
print(lst2[i][j])
else:
continue
3.leetcode 852题
#第一种方法,直接看这个序列是不是到最大值一直增加,到达极值后一直减小
class Solution:
def peakIndexInMountainArray(self, A: List[int]) -> int:
max_A = max(A)
temp = 0
for i in range(len(A)):
if A[i] < A[i+1] and A[i+1] != max_A:
continue
elif A[i] < A[i+1] and A[i+1] == max_A:
temp = i+1
break
else:
return 0
for j in range(temp,len(A) - 1):
if A[j] > A[j+1] and j+1 < len(A) - 1:
continue
elif A[j] > A[j+1] and j+1 == len(A) - 1:
return temp
else:
return 0
#执行结果:通过
#执行用时:
#120 ms, 在所有 Python3 提交中击败了15.82%的用户
#内存消耗:15 MB, 在所有 Python3 提交中击败了25.00%的用户
#第二种方法:前后搜索看遇到极值时的index是否相等
for i in range(len(A) - 1):
if A[i] < A[i+1]:
continue
else:
temp = i
break
for j in range(len(A) - 1):
if A[len(A) - j - 1] < A[len(A) - j - 2]:
continue
else:
temp2 = len(A) - j - 1
break
if temp == temp2:
return temp
else:
return 0
#执行结果:通过
#执行用时:100 ms, 在所有 Python3 提交中击败了61.11%的用户
#内存消耗:14.9 MB, 在所有 Python3 提交中击败了25.00%的用户
#第三种方法:二分法
low = 0
high = len(A) - 1
while low < high:
mid = (high + low) // 2
if A[mid] > A[mid + 1] and A[mid] > A[mid - 1]:
return mid
elif A[mid] < A[mid + 1]:
low = mid + 1
elif A[mid] < A [mid - 1]:
high = mid
#执行结果:通过
#执行用时:100 ms, 在所有 Python3 提交中击败了61.11%的用户
#内存消耗:14.9 MB, 在所有 Python3 提交中击败了25.00%的用户
#第四种方法:针对本题目的最好方法,因为确定这是一个山峰数组,所以我们可以直接返回该列表最大值的index。
#上面的方法更适用于不确定是否为山峰数组时的方法
return A.index(max(A))
#执行结果:通过
#执行用时:92 ms, 在所有 Python3 提交中击败了91.05%的用户
#内存消耗:15 MB, 在所有 Python3 提交中击败了25.00%的用户