【Python】小甲鱼课后习题第19、20讲--列表(最新版)

问答题


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

答:如果创建了一个列表,但没有将其赋值给变量名,这就是一个匿名列表。由于没有名字,将导致列表创建完也没办法再次访问到它。

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

答:我的答案是:list1.pop()和list1[-1]。其实用pop()是不严谨的,因为虽然得到了列表的最后一个元素,但同时也弹出了该元素。

小甲鱼给的答案是list1[len(list1) - 1] 和 list1[-1]。

使用下标索引的方式可以实现列表的随机访问(就是你想访问哪个元素就访问哪个)。

第一种方法是先使用 len() 函数计算列表的长度,然后 -1 是因为下标索引值是从 0 开始数起的。

第二种方法因为 Python 是允许反向索引的,下标值为 -1,则表示直接访问最后一个元素。

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

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

答:代码如下:

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

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

答:支持,字符串也是可迭代对象。

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

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

答:不会。因为 Python 的列表是支持任何类型的对象,当然也包括列表啦。不过添加之后,s 列表的值会变成 [1, 2, 3, [4, 5, 6]],第 4 个元素是另外一个列表。

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

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

答:s.insert(len(s), 6)

列表的 insert(i, x) 方法需要两个参数,第一个参数是指定插入的位置,这里我们要将 6 这个数据插入到列表末尾,那么将该参数设置为 len(s) 即可。注意灵活使用 len() 函数。

3. 请问下面代码执行后,列表 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’]。

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

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

答:s[len(s):] = [“上山打老虎”]

切片的语法很神奇,s[len(s):] = [“上山打老虎”] 其实相当于执行了两个步骤……

  1. 将赋值号左侧指定位置的内容清空
  2. 将赋值号右侧可迭代对象的内容插入到左侧列表被清空的位置

由于 s[len(s):] 指定的是列表的末尾,所以该代码是将右侧可迭代对象的内容(“上山打老虎”)插入 s 列表的末尾。

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

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

答:s[len(s):] = “上山打老虎”

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

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

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

答:[1, 2, 3, 2, 1]

请参考第 4 题的解析,s[len(s)-2:] = [2, 1] 的第一个步骤是先将 s[len(s)-2:] 指定的内容清除,即清除掉最后两个元素;第二个步骤是插入赋值号右边的内容,所以结果是 [1, 2, 3, 2, 1]。

总结:注意列表增改的参数对象是否为可迭代对象,若是可迭代对象的话,就将可迭代对象中的元素依次赋给列表(除了append方法)。


动动手

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

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

答:代码如下:

target=9
nums=[2,11,7,15]

for i in range(len(nums)):
    for j in range(i+1,len(nums)):
        if nums[i]+nums[j]==target:
            print(f"[{i},{j}]")
            break
    break

这里两层嵌套循环的执行逻辑就是:外层循环获取一个被加数,然后和内层循环获取的每一个加数进行相加,判断它们的和是否等于 target 变量的值,如果是,则打印结果。

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

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

target=0
nums=[]

while True:
    user_input=input("请录入一个整数(输入STOP结束): ")
    if user_input=="STOP":
        break
    nums.append(int(user_input))

target=int(input("请录入目标整数: "))

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

【注】一定要注意input()返回的是字符串类型,使用之前要进行类型转换!!!

小甲鱼提供的代码如下:

nums = []

isInput = True
while isInput == True:
    x = input("请录入一个整数(输入STOP结束):")
    if x != "STOP":
        nums.append(int(x))
    else:
        isInput = False

target = int(input("请录入目标整数:"))

isFind = False
n = len(nums)
for i in range(n):
    for j in range(i+1, n):
        if nums[i] + nums[j] == target:
            print([i, j])
            isFind = True

if isFind == False:
    print("找不到!")

isInput 和 isFind 两个变量是用于标识程序状态的,比如 isInput 用来标识用户是否还在录入整数,默认将其赋值为 True,当检测到用户输入的是 “STOP”,则将其修改为 False,我们将它直接作为循环的退出条件,岂不妙哉!

同样的道理,我们使用 isFind 变量来记录 “是否成功找到” 这么一个事儿,等所有元素逐一比较之后(两层循环都执行完毕),如果它还是 False,就说明没有找到,就会返回 “找不到!”

学会使用这种状态标识符还是有必要的~

2. 回忆学习过的 random 模块,生成一个由 10000 个整数(范围是 1 ~ 65535)构成的随机列表,目标值 target 由用户输入。

程序实现如下:
在这里插入图片描述
答:代码如下:

import random

nums=[]
for i in range(10000):
    x=random.randint(1,65535)
    nums.append(x)
    
target=int(input("请录入目标整数: "))

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

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

条件:

  • 字符串仅包含 ‘(’、’)’、’[’、’]’、’{’、’}’ 这三对括号的组合
  • 左右括号必须成对编写,比如 “()” 是合法的,"(" 则是非法的
  • 左右括号必须以正确的顺序闭合,比如 “{()}” 是合法的,"{(})" 则是非法的

示例:
在这里插入图片描述

str1=input("请输入待测试字符串: ")
stack=[]       #建栈
str2=["(","{","["]
IsFalse=True

for each in str1:
    if each in str2:              # 如果读到左括号,则添加到栈中
        stack.append(each)
    else:                         # 读到右括号的情况
        if each not in [")","}","]"]:
            continue
        else:
            if len(stack)==0:
                IsFalse=False
                break
            if each == ")":
                a=stack.pop()
                if a!="(" :
                    IsFalse=False
                    break
            elif each == "}":
                a=stack.pop()
                if a!="{":
                    IsFalse=False
                    break
            elif each == "]":
                a=stack.pop()
                if a!="[":
                    IsFalse=False
                    break

if IsFalse==True and len(stack)==0:
    print("合法^o^")
else:
    print("非法T_T")

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

早知晓

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值