4.Python基础之列表

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%的用户
        
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值