# 列表与列表推导式

# 选择题

# 1. 题目

x = [2,4,6,8]
x.insert(1, 3)
x值为(  )
A.[3, 2, 4, 6, 8]
B.[2, 4, 1, 6, 8]
C.[2, 4, 6, 1, 8]
D.[2, 3, 4, 6, 8]

答案:D

选项 A:[3, 2, 4, 6, 8] → 错误。insert () 方法的第一个参数是插入位置,不是替换位置。

选项 B:[2, 4, 1, 6, 8] → 错误。insert (1, 3) 表示在索引 1 的位置插入 3,不是替换索引 1 的元素为 1。

选项 C:[2, 4, 6, 1, 8] → 错误。insert (1, 3) 不是在末尾插入,也不是替换末尾元素。

选项 D:[2, 3, 4, 6, 8] → 正确。insert (1, 3) 表示在索引 1 的位置插入元素 3,原索引 1 及之后的元素依次后移一位。


# 2. 题目

x= list(range(7)) 
del x[1:3] 
print(x)输出是什么(  )
A.[0, 3, 4, 5, 6]
B.[0, 1, 3, 4, 5, 6]
C.[0, 4, 5, 6]
D.[0, 1, 4, 5, 6]

答案:A

选项 A:[0, 3, 4, 5, 6] → 正确。 list(range(7)) 生成列表 [0, 1, 2, 3, 4, 5, 6], del x[1:3] 删除索引 1 到 2 的元素(左闭右开),即删除 1 和 2,剩余元素为 [0, 3, 4, 5, 6]。

选项 B:[0, 1, 3, 4, 5, 6] → 错误。del x [1:3] 会删除索引 1 和 2 的元素,不会保留索引 1 的元素。

选项 C:[0, 4, 5, 6] → 错误。del x [1:3] 只删除索引 1 和 2 的元素,不会删除索引 3 的元素。

选项 D:[0, 1, 4, 5, 6] → 错误。理由同选项 B。


# 3. 题目

已知 x = [[1, 2, 3,], [4, 5, 6]],那么表达式 sum([i*j for i,j in zip(*x)]) 的值为__________。
A.100
B.37
C.60
D.44

答案:C

选项 A:100 → 错误。计算结果应为 60。

选项 B:37 → 错误。计算过程:range (1,5) 生成 [1,2,3,4],range (4,8) 生成 [4,5,6,7],zip 后得到 [(1,4),(2,5),(3,6),(4,7)],乘积和为 4+10+18+28=60。

选项 C:60 → 正确。计算过程同上。

选项 D:44 → 错误。计算结果应为 60。


# 判断题

# 1. 题目

对于数字n,如果表达式 0 not in [n%d for d in range(2, n)] 的值为True则说明n是素数。(  )

答案:对

解析:该表达式的含义是:对于 n,检查从 2 到 n-1 的所有整数 d,n 除以 d 的余数是否都不为 0。如果余数都不为 0(即 0 不在余数列表中),则 n 是素数。


# 填空题

# 1. 题目

已知 vec = [[1,2,3], [3,4,5]],则表达式 [[row[i] for row in vec] for i in range(len(vec[0]))] 的值为________

答案:[[1, 3], [2, 4], [3, 5]]

解析:这是一个嵌套列表推导式。外层列表推导式 for i in range(len(vec[0])) 遍历原列表每行的列索引(原每行有 3 个元素,所以 i 取 0、1、2)。内层列表推导式 [row[i] for row in vec] 对每个列索引 i,提取原列表中每一行的第 i 个元素,组成新列表。最终结果是原矩阵的转置。


# 2. 题目

切片操作list(range(6))[::2]执行结果为________

答案:[0, 2, 4]

解析:切片格式为 列表[起始索引:结束索引:步长]list(range(6)) 生成列表 [0, 1, 2, 3, 4, 5]。 [::2] 表示起始索引为 0(省略),结束索引为列表末尾(省略),步长为 2,即每隔 1 个元素取 1 个,结果为 [0, 2, 4]。


# 3. 题目

执行语句x = [[j] for i in range(3) for j in _______]之后,x的值为[[0], [0], [1], [0], [1], [2]]

答案:range (i+1)

解析:这是一个嵌套列表推导式。外层循环 i 依次取 0、1、2,内层循环 j 的取值范围由 range (i+1) 决定:当 i=0 时,j 取 0;当 i=1 时,j 取 0、1;当 i=2 时,j 取 0、1、2。最终生成的列表为 [[0], [0], [1], [0], [1], [2]]。


# 4. 题目

已知列表 x = [1, 2],那么表达式 list(enumerate(x)) 的值为_________

答案:[(0,1),(1,2)]

解析enumerate() 函数用于将列表转换为索引 - 元素对,默认索引从 0 开始。 list(enumerate(x)) 将枚举对象转换为列表,结果为 [(0,1),(1,2)]。


# 5. 题目

已知列表 x = [1, 2],那么连续执行命令 y = x和 y.append(3) 之后,x的值为_______

答案:[1,2,3]

解析:列表是可变对象,执行 y = x 时,y 和 x 指向同一个内存地址的列表对象。因此,对 y 的修改(如 append)会直接反映到 x 上。


# 6. 题目

已知 x = [3, 5, 7],那么执行语句 x[len(x):] = [1, 2]之后,x的值为_______

答案:[3,5,7,1,2]

解析len(x) 计算列表 x 的长度,结果为 3。 x[3:] 表示从索引 3 开始的切片,由于列表 x 的索引范围是 0-2,所以这是空切片,指向列表末尾的空位。 x[3:] = [1,2] 的本质是在列表末尾插入新列表 [1,2] 的元素,最终 x 的值为 [3,5,7,1,2]。


# 7. 题目

使用列表推导式得到100以内所有能被13整除的数的代码可以写作[i for i in range(100) if ________ ]

答案:i%13==0

解析:列表推导式的条件部分需要判断 i 是否能被 13 整除,即 i 除以 13 的余数是否为 0,因此条件为 i%13==0。


# 8. 题目

已知 x = [1, 2, 3, 2, 3],执行语句 x.remove(2) 之后,x的值为_______

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

解析remove() 方法用于删除列表中第一个出现的指定元素。x.remove (2) 会删除列表 x 中第一个出现的 2,剩余元素为 [1,3,2,3]。


# 9. 题目

表达式 list(map(lambda x: x+5, [1, 2, 3, 4, 5])) 的值为 __________

答案:[6,7,8,9,10]

解析map() 函数将 lambda 函数应用于列表中的每个元素,lambda 函数 x+5 将每个元素加 5,结果为 [6,7,8,9,10]。


# 10. 题目

已知 x = [[1, 2, 3,], [4, 5, 6]],那么表达式 sum([i*j for i,j in zip(*x)]) 的值为__________

答案:32

解析*x 将 x 解包为两个列表 [1,2,3] 和 [4,5,6], zip(*x) 将两个列表的对应元素打包成元组 [(1,4),(2,5),(3,6)],列表推导式计算每个元组的乘积 [4,10,18],sum () 函数求和得到 32。


# 11. 题目

已知 x = 'abcd' 和 y = 'abcde',那么表达式 __________ for i,j in zip(x,y)] 的值为[True, True, True, True]

答案:i==j

解析zip(x,y) 将两个字符串的对应字符打包成元组 [('a','a'),('b','b'),('c','c'),('d','d')],列表推导式需要判断每个元组的两个字符是否相等,因此表达式为 i==j。


# 12. 题目

表达式 [index for index, value in enumerate([3,5,7,3,7]) if value == max([3,5,7,3,7])] 的值为______

答案:[2,4]

解析max([3,5,7,3,7]) 得到列表的最大值 7, enumerate() 将列表转换为索引 - 元素对 [(0,3),(1,5),(2,7),(3,3),(4,7)],列表推导式筛选出值为 7 的元素的索引,结果为 [2,4]。