【Python】小甲鱼2022最新版课程p20-p26——列表笔记2(课后作业篇)

文章目录

课后作业

0.列表都可以存放一些什么东西?

答: Python 的列表是一个打了激素的数组,如果把数组比喻成集装箱,那么 Python 的列表就是一个大仓库,Ta 可以存放我们已经学习过的任何数据类型。

1.向列表增加元素有哪些方法?

答:有append()、extend() 和 insert()。

2.append() 方法和 extend() 方法都是向列表的末尾增加元素,请问他们有什么区别?

答:append()方法是将参数作为一个元素增加到列表的末尾,即无论 append 的参数是什么类型,都将它作为一个元素添加到列表尾。
而extend()方法则是将参数作为一个列表在末尾去扩展列表。
比如member.append([‘竹林小溪’, ‘Crazy迷恋’]) 和 member.extend([‘竹林小溪’,
‘Crazy迷恋’]) 实现的效果一样吗?答案是不一样的。如下图:
在这里插入图片描述

3.有列表 name = [‘F’, ‘i’, ‘h’, ‘C’],如果小甲鱼想要在元素 ‘i’ 和 ‘h’ 之间插入元素 ‘s’,应该使用什么方法来插入?

答:insert(2, ‘s’)

4.自己动手试试看,并分析在这种情况下,向列表添加数据应当采用哪种方法比较好?

假设给定以下列表:
member = [‘小甲鱼’, ‘黑夜’, ‘迷途’, ‘怡静’, ‘秋舞斜阳’]
要求将列表修改为:
member = [‘小甲鱼’, 88, ‘黑夜’, 90, ‘迷途’, 85, ‘怡静’, 90, ‘秋舞斜阳’, 88]
方法一:使用 insert() 和 append() 方法修改列表。
方法二:重新创建一个同名字的列表覆盖。

答: 方法一:
在这里插入图片描述
方法二:
在这里插入图片描述
对于这种情况,明显是第二种方法看起来要好一些。不过对于大型的列表,第一种方法可能更合适,所以我们说永远没有最好的,只有最合适的!

5.利用 for 循环打印上边 member 列表中的每个内容,如图:

在这里插入图片描述

答:代码如下:

member = ['小甲鱼', 88, '黑夜', 90, '迷途', 85, '怡静', 90, '秋舞斜阳', 88]
for m in member:
	print(m)

6.上一题打印的样式不是很好,能不能修改一下代码打印成下图的样式呢?【请至少使用两种方法实现】

在这里插入图片描述
答:方法一:根据元素位置输出

member = ['小甲鱼', 88, '黑夜', 90, '迷途', 85, '怡静', 90, '秋舞斜阳', 88]
for m in member:
    if member.index(m) % 2 == 0:
        print(m, end=' ') 
    else:
        print(m)

方法二:根据元素类型输出

member = ['小甲鱼', 88, '黑夜', 90, '迷途', 85, '怡静', 90, '秋舞斜阳', 88]
for m in member:
    if isinstance(m, str):
        print(m, end=' ') 
    else:
        print(m)

7.下边的列表分片操作会打印什么内容?


>>> list1 = [1, 3, 2, 9, 7, 8]
>>> list1[2:5]

答:[2, 9, 7],有图有真相:
在这里插入图片描述

8.请问 list1[0] 和 list1[0:1] 一样吗?

答:不一样,list[0]返回的是列表中索引为0的元素的值,而list1[0:1]则是返回一个只含有索引为0的元素的列表,如下:
在这里插入图片描述

9.如果你每次想从列表的末尾取出一个元素,并将这个元素插入到列表的最前边,你会怎么做?

答:list1.insert(0, list1.pop()),如下图:
在这里插入图片描述

10.有些鱼油比较调皮,他说我想试试 list1[-3:-1] 会不会报错,怎么知道一试居然显示 [9, 7],这是怎么回事呢?

答:Python支持复数索引,正常索引是从左到右索引,负数索引是从右到左。从列表末尾来算的话,列表最后一个元素的索引为-1,倒数第二个为-2,以此类推,所以最后会打印[9, 7]。

11.有关分片的步长。

在进行分片的时候,我们知道分片的开始和结束位置需要进行指定,但其实还有另外一个隐藏的设置:步长。在普通的分片操作中,步长默认设置为1,表示逐个遍历元素。其实我们可以人为调整步长以达到不可告人的秘密。如下:在这里插入图片描述
那么依你推测,关于步长的知识点还有哪些(很多知识点都是通用的)?

答:具体如下图:
在这里插入图片描述

12.课堂上小甲鱼说可以利用分片完成列表的拷贝 list2 = list1[:],那事实上可不可以直接写成 list2 = list1 更加简洁呢?

答:千万不可以!
变量不是一个盒子,它并不能存储数据, list2 = list1 这样直接赋值的方式,其实就是相当于多了一个变量指向同一个东西,给一个固定的东西增加了一个新的标签而已,此时list和list2其实就是一样的,会互相影响对方的值。
而分片的操作完成的是浅拷贝,浅拷贝可以拷贝父对象,由于这里没有子对象,所以用此方法完成的拷贝使得list2和list1指向的是不同对象,所以不会相互影响。
在这里插入图片描述

14.如果不上机操作,你觉得会打印什么内容?

>>> old = [1, 2, 3, 4, 5]
>>> new = old
>>> old = [6]
>>> print(new)

答:[1, 2, 3, 4, 5]。
这是python贴标签式的变量赋值方法导致的。old = [6]这个语句实际上是将old这个标签贴在了一片新的内存空间上(old指向了新的引用),这片内存空间中存储了[6]这个列表,所以old在被赋了新值后,不再指向原来的内存空间,所以new不会改变。
在这里插入图片描述

15.请问如何将下边这个列表的’小甲鱼’修改为’小鱿鱼’?

list1 = [1, [1, 2, ['小甲鱼']], 3, 5, 8, 13, 18]

代码如下图:
在这里插入图片描述

16.要对一个列表进行顺序排序,请问使用什么方法?逆序排序呢?

 #顺序排序
>>> 列表名.sort()
#逆序排序1
>>> 列表名.sort() #顺序排序
>>> 列表名.reverse() #倒置
#逆序排序2
>>> 列表名.sort(reverse=True) 直接逆序排序

17.问题:请先在 IDLE 中获得下边列表的结果,并按照上方例子把列表推导式还原出来。


>>> list1 = [(x, y) for x in range(10) for y in range(10) if x%2==0 if y%2!=0]

答:还原代码如下:

list1 = []
for x in range(10):
    for y in range(10):
        if x%2 == 0:
            if y%2 != 0:
                list1.append((x, y))

18.活学活用:请使用列表推导式补充被小甲鱼不小心涂掉的部分。

在这里插入图片描述

答:代码如下:[y + ":" + x[2:] for x in list1 for y in list2 if x[0] == y[0]],有图有真相:
在这里插入图片描述

19.你知道什么是匿名列表吗?

答:创建一个列表,但没有将其赋值给变量名,那它一个匿名列表。由于没有名字,将导致该列表创建完无法永远再次访问到。

20.如果有一个列表 list1,有两种方法可以获取到该列表的最后一个元素,你知道分别是什么吗?

答,最开始想到的是使用list1[-1]以及list1.pop()方法,但是其实pop()方法虽然获取到了但是也从列表中弹出了该元素,正确答案是list1[len(list1) - 1] 和 list1[-1]。

21.下面有两列表,请问如何将 list2 列表中的全部元素,添加到 list1 列表中第 2 和第 3 个元素的中间。


>>> list1 = [1, 2, 8, 9]
>>> list2 = [3, 4, 5, 6, 7]

答:答案如下图:
在这里插入图片描述

22.列表的 extend() 方法是否支持使用字符串来扩展列表?

答:支持,字符串也是可迭代对象,如下图:
在这里插入图片描述

23. 请问下面代码是否会报错?

>>> s = [1, 2, 3]
>>> s.append([4, 5, 6])

答:不会的,这里append的[4, 5, 6]就是作为一整个元素添加到s的末尾。如下图:

在这里插入图片描述

24.请将下面代码改为使用列表的 insert() 方法实现。

>>> s = [1, 2, 3, 4, 5]
>>> s.append(6)

答:s.insert(len(s), 6),如下图:

在这里插入图片描述

25. 请问下面代码执行后,列表 s 的内容是什么?


>>> s = [1, 2, 3, 4, 5]
>>> s.extend(["FishC"])

答案:[1, 2, 3, 4, 5, ‘FishC’],如下图:
在这里插入图片描述
补充:
列表的 extend() 方法的参数需要是一个可迭代对象,然后将可迭代对象的元素逐个插入到列表中。那么这里的可迭代对象是 [“FishC”],它只有一个元素,就是 “FishC”。如果代码换成 s.extend(“FishC”),那么结果就会变成 [1, 2, 3, 4, 5, ‘F’, ‘i’, ‘s’, ‘h’, ‘C’]。

26. 请使用切片的语法,实现与下面代码相同的效果。


>>> s = [1, 2, 3, 4, 5]
>>> s.extend("上山打老虎")
>>> s
[1, 2, 3, 4, 5, '上', '山', '打', '老', '虎']

答:s[len(s):] = [“上山打老虎”]。
切片的语法很神奇,s[len(s):] = [“上山打老虎”] 其实相当于执行了两个步骤:
1)将赋值号左侧指定位置的内容清空;
2)将赋值号右侧可迭代对象的内容插入到左侧列表被清空的位置。
由于 s[len(s):] 指定的是列表的末尾,所以该代码是将右侧可迭代对象的内容(“上山打老虎”)插入 s 列表的末尾。

27. 请使用切片的语法,实现与下面代码相同的效果。

>>> s = [1, 2, 3, 4, 5]
>>> s.extend("上山打老虎")
>>> s
[1, 2, 3, 4, 5, '上', '山', '打', '老', '虎']

答: s[len(s):] = “上山打老虎”
这一题跟上一题比较的话,有一个容易混淆的点,就是上一题的可迭代对象是一个列表([“上山打老虎”],这个只有 1 个元素),而这一题的可迭代对象是一个字符串(“上山打老虎”,有 5 个字符元素构成)。

28. 请问下面代码执行后,列表 s 的内容是什么?

>>> s = [1, 2, 3, 4, 5]
>>> s[len(s)-2:] = [2, 1]

答:[1, 2, 3, 2, 1],参考上面26&27两道题即可!

总结:对于extend(方法和切片的方法增改列表,注意增改的参数对象是否为可迭代对象,若是可迭代对象,则就将可迭代对象中的元素依次赋为列表!

29.给定一个整数列表 nums 和一个目标值 target,请在该数组中找出和为目标值的两个元素,并将它们的数组下标值打印出来。

比如给定的列表 nums = [2, 7, 11, 15],目标值 target = 9,那么由于 nums[0] + nums[1] = 2 + 7 = 9,所以打印结果是:[0, 1]

答:代码如下:

nums = [2, 7, 11, 15]
target = 9
output_list = []
for i in range(len(nums)):
    for j in range(i+1, len(nums)):
        if nums[i] + nums[j] == target:
            output_list.extend([i, j])
            break
    break
print(output_list)

不使用列表,直接拼接输出结果:
链接:python print中f格式化输出简单介绍

nums = [2, 7, 11, 15]
target = 9
for i in range(len(nums)):
    for j in range(i+1, len(nums)):
        if nums[i] + nums[j] == target:
            print(f"[{
      
      i},{
      
      j}]")

运行结果:
在这里插入图片描述

30.这次我们想让用户自己来录入 nums 和 target 的数据,请修改上一题的代码,让程序实现如下:

在这里插入图片描述
答案:代码如下:

nums = []
while 1:
    num = input("请录入一个整数(输入STOP结束):")
    if num.isdigit():
        nums.append(int(num))
    elif num == "STOP":
        break
    else:
        print("输入数据有误,请重新录入一个整数(输入STOP结束)!")
while 1:
    target = input("请录入目标整数:")
    if target.isdigit():
        target = int(target)
        break
    else:
        print("输入数据有误,请重新录入目标整数!") 
for i in range(len(nums)):
    for j in range(i+1, len(nums)):
        if nums[i] + nums[j] == target:
            print(f"[{
      
      i},{
      
      j}]")

运行结果:
在这里插入图片描述

虽然代码考虑到了数据输入错误的情况,但是对于如果找不到的情况并没有考虑进去,增加进去后的代码(加一个isFind标志位):

nums = []
isFind = False
while 1:
    num = input("请录入一个整数(输入STOP结束):")
    if num.isdigit():
        nums.append(int(num))
    elif num == "STOP":
        break
    else:
        print("输入数据有误,请重新录入一个整数(输入STOP结束)!")
while 1:
    target = input("请录入目标整数:")
    if target.isdigit():
        target = int(target)
        break
    else:
        print("输入数据有误,请重新录入目标整数!")
for i in range(len(nums)):
    for j in range(i+1, len(nums)):
        if nums[i] + nums[j] == target:
            print(f"[{
      
      i},{
      
      j}]")
            isFind = True
if not isFind:
    print("找不到和为目标值的两个元素!")

运行结果:
在这里插入图片描述

31. 回忆学习过的 random 模块,生成一个由 10000 个整数(范围是 1 ~ 65535)构成的随机列表,目标值 target 由用户输入。使得程序实现如下:

在这里插入图片描述
答案:代码如下:

import random
nums = []
for i in range(10000):
    x = random.randint(1, 65535)
    nums.append(x)
while 1:
    target = input("请录入目标整数:")
    if target.isdigit():
        target = int(target)
        break
    else:
        print("输入数据有误,请重新录入目标整数!")
        
for s in range(len(nums)):
    for j in range(s+1, len(nums)):
        if nums[s] + nums[j] == target:
            print(f"[{
      
      s},{
      
      j}]")

运行结果(注意:列表中的元素是随机生成的,而打印的是元素的下标,不是元素本身!):
在这里插入图片描述

32. 请编写一个程序,判断给定的字符串 s 中括号的写法是否合法。

条件:
1.字符串仅包含 ‘()’、’[]’、’{}’ 这三对括号
2.左右括号必须成对编写,一旦左括号出现,则右括号必须要有。比如 “()” 是合法的,“(” 则是非法的
3.括号可以嵌套出现,但是必须以正确的顺序闭合,比如 “{()}” 是合法的,“{(})” 则是非法的
代码如下:

stack = [] #创建栈
tupl = ('(', '{', '[') # 左括号组成的元组
tupr = (')', '}', ']') # 右括号组成的元组
tup = ('()', '{}', '[]') # 完整的括号组成的元组
isRight = True #设置标志位
inputStr = input("请输入字符串:")
for s in inputStr:
    if s in tupl: # 判断字符是否是左括号中的一种
        stack.append(s) #是的话,压栈
    elif s not in tupr: # 判断字符是否是右括号的一种
        continue #不是的话,转入下一次循环
    else: #是的话,进行括号完整性判断
        if (stack.pop() + s) not in tup:
            isRight = False #一旦有不合法的括号出现,直接修改标志位
if isRight and not stack: #确保标志位的同时,保证栈中没有了元素
    print(inputStr,'是合法字符串!')
else:
    print(inputStr,'不是合法字符串!')

运行结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45041745/article/details/126018755