问答题
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):] = [“上山打老虎”] 其实相当于执行了两个步骤……
- 将赋值号左侧指定位置的内容清空
- 将赋值号右侧可迭代对象的内容插入到左侧列表被清空的位置
由于 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")