如何从多层嵌套列表中删除包含[-1,2]的子列表?
解决嵌套列表中删除指定子列表的问题
问题描述
给定如下嵌套结构的数据集(已修正原代码的字符串引号语法错误):
DATA = [ ('MY NAME IS SAM MY AGE IS 25', 'labels:', [-1, 2, 'ACCOUNT BALANCE'], [-1, 2, 'NAME'], [48, 55, 'XYZ']), ('i AM AHMAD MY AGE IS 41', 'labels:', [-1, 2, 'ACCOUNT BALANCE'], [-1, 2, 'ABC'], [48, 55, 'VSG']), ('MY NAME IS KATE ', 'labels:', [-1, 2, 'ABC'], [-1, 2, 'DEF'], [48, 55, 'GHI']) ]
需要删除所有同时包含-1和2的子列表(比如[-1, 2, 'ACCOUNT BALANCE']这类),但之前尝试的列表推导式EXDATA = [i for i in DATA if i and (-1 not in i)]未生效,期望得到的结果是:
[ ('MY NAME IS SAM MY AGE IS 25', 'labels:', [48, 55, 'XYZ']), ('i AM AHMAD MY AGE IS 41', 'labels:', [48, 55, 'VSG']), ('MY NAME IS KATE ', 'labels:', [48, 55, 'GHI']) ]
错误原因分析
原来的推导式逻辑有误:它检查的是整个元组是否包含-1,但元组内既有字符串也有子列表,-1 not in i的判断对字符串元素不生效,也没有精准定位到需要过滤的目标子列表。
正确解决方案
使用嵌套列表推导式,针对每个元组内的元素逐一过滤,只保留不符合“是列表且同时包含-1和2”条件的元素:
EXDATA = [tuple(item for item in tup if not (isinstance(item, list) and -1 in item and 2 in item)) for tup in DATA]
代码说明
- 外层遍历
DATA中的每个元组tup - 内层遍历元组里的每个
item,判断规则:- 若
item不是列表,直接保留 - 若
item是列表但不同时包含-1和2,同样保留 - 仅当
item是列表且同时存在-1和2时,才过滤该元素
- 若
- 将每个元组过滤后的元素重新组合成元组,最终组成目标列表
EXDATA
执行结果
运行上述代码后,EXDATA将完全匹配期望的处理结果。
内容的提问来源于stack exchange,提问作者Abdul Samad
相关产品推荐
相关产品推荐

