使用列表推导式筛选非1元素并存1到单独列表时出现None值问题
问题原因
list.append() 方法没有返回值,执行后默认返回None,这是你得到多余None的核心原因。
你写的三元表达式a if a != 1 else one_list.append(a),当元素等于1时,会执行one_list.append(a),同时将该方法的返回值None作为结果写入新列表。而[表达式 for 元素 in 迭代器]结构的列表推导式,会为每个迭代元素生成一个对应的结果值,不会自动跳过不符合条件的元素,因此最终a_list里才会出现多个None值。
解决方法
方法1:普通for循环处理(最推荐,可读性最高)
直接遍历原列表,分别分发元素到两个目标列表,逻辑清晰无歧义:
a_list = [1,1,1,1,3,4,5] one_list = [] new_a_list = [] for num in a_list: if num != 1: new_a_list.append(num) else: one_list.append(num) # 替换原列表内容 a_list[:] = new_a_list print(a_list) # 输出: [3, 4, 5] print(one_list) # 输出: [1, 1, 1, 1]
方法2:带条件过滤的列表推导式(可选,适合偏好简写的场景)
如果要在列表推导式里完成逻辑,可以利用逻辑判断的短路特性跳过1的写入,同时收集1到另一个列表:
a_list = [1,1,1,1,3,4,5] one_list = [] a_list[:] = [num for num in a_list if num != 1 or (one_list.append(num), False)[1]] print(a_list) # 输出: [3, 4, 5] print(one_list) # 输出: [1, 1, 1, 1]
注意:该写法利用了
or的短路执行逻辑,以及元组取索引1的值False让num==1的条件判定为不成立,不会把元素写入新列表,同时会执行append操作收集1,该写法可读性较低,不建议在生产环境使用。
内容的提问来源于stack exchange,提问作者Stack Vau
相关产品推荐
相关产品推荐

