Python:按元素符号过滤嵌套列表,保留元素符号统一的子列表
筛选元素符号完全一致的子列表
这里有几种实用的方法来实现你想要的需求,从纯Python原生实现到借助第三方库的简洁写法都有:
方法一:纯Python原生实现(无需额外依赖)
这种方法适合所有Python环境,逻辑清晰,容易理解和修改:
original_list = [[1,2,3,4],[-1,-2,-3,-4],[1,2,-3,-4]] def all_same_sign(sublist): # 先处理空列表的边界情况(如果你的列表不会有空子列表可以忽略) if not sublist: return False # 获取第一个元素的符号:1代表正,-1代表负,0代表零 first_num = sublist[0] first_sign = 1 if first_num > 0 else -1 if first_num < 0 else 0 # 检查子列表中所有元素的符号是否和第一个元素一致 return all( (1 if num > 0 else -1 if num < 0 else 0) == first_sign for num in sublist ) # 用列表推导式快速筛选符合条件的子列表 filtered_list = [sublist for sublist in original_list if all_same_sign(sublist)] print(filtered_list) # 输出: [[1, 2, 3, 4], [-1, -2, -3, -4]]
逻辑说明:
- 首先定义辅助函数
all_same_sign,先判断子列表是否为空(避免后续报错) - 提取第一个元素的符号作为基准
- 使用
all()函数遍历子列表的每个元素,验证它们的符号是否和基准完全一致 - 最后通过列表推导式过滤出符合条件的子列表
方法二:借助Numpy库实现(更简洁)
如果你的项目已经在使用Numpy,那么可以用更简洁的写法:
import numpy as np original_list = [[1,2,3,4],[-1,-2,-3,-4],[1,2,-3,-4]] # np.sign()会返回每个元素的符号值(1/-1/0),np.unique()去重后长度为1则说明符号统一 filtered_list = [ sublist for sublist in original_list if len(np.unique(np.sign(sublist))) == 1 ] print(filtered_list) # 输出同样符合预期
逻辑说明:
np.sign(sublist)会将子列表中的每个元素转换为对应的符号值np.unique()会去除符号值中的重复项,如果结果长度为1,说明所有元素的符号完全相同
特殊情况说明
如果你的子列表中可能包含0,需要注意:
- 按照上述逻辑,只有当子列表所有元素都是0时才会被保留(因为0的符号是0,和正负都不一致)
- 如果你需要调整对0的处理规则(比如允许0和正/负共存),可以修改符号判断的逻辑,比如把0视为和正数同符号,只需要调整
first_sign和后续的判断条件即可
内容的提问来源于stack exchange,提问作者user3418064
相关产品推荐
相关产品推荐

