如何从嵌套元组列表中移除第二个元素为'NNP'的元组
解决嵌套元组列表中移除指定词性元组的问题
嘿,我来帮你搞定这个需求!你的数据是三层嵌套的结构,目标是过滤掉所有第二个元素为NNP的元组,用Python的列表推导式或者嵌套循环都能轻松实现,下面给你详细的方案:
先修正输入数据的小问题
首先注意你提供的示例里第一个子列表的元组之间缺了逗号,这会导致语法错误,我先帮你补全正确的输入:
lis = [ [[('This', 'DT'), ('PM', 'NNP'), ('Doctor', 'NNP'), ('Sambit', 'NNP'), ('Patra', 'NNP'), ('Spokesperson', 'NNP')]], [[('Can', 'MD'), ('Media', 'NNP'), ('lambast', 'VB'), ('Sonia', 'NNP'), ('Gandhi', 'NNP'), ('up', 'RP'), ('Dalit', 'NNP'), ('Sitaram', 'NNP'), ('Dalit', 'NNP'), ('President', 'NNP')]] ]
方法1:简洁的嵌套列表推导式
这是Python里处理这类嵌套结构最常用的方式,格式化后的多行写法更易读:
# 逐层遍历并过滤,只保留词性不是NNP的元组 filtered_lis = [ [ [token for token in sub_sub_list if token[1] != 'NNP'] for sub_sub_list in sub_list ] for sub_list in lis ]
代码解释
- 最外层遍历
lis中的每一个二级列表(比如[[('This', 'DT'), ...]]) - 中间层遍历二级列表中的元组列表(比如
[('This', 'DT'), ...]) - 最内层遍历每个元组,只保留第二个元素(词性)不等于
NNP的元组
运行后得到的结果是:
[ [[('This', 'DT')]], [[('Can', 'MD'), ('lambast', 'VB'), ('up', 'RP')]] ]
方法2:更直观的嵌套for循环
如果觉得列表推导式有点抽象,用嵌套循环来写逻辑会更清晰,适合新手理解:
filtered_lis = [] # 遍历最外层列表 for sub_list in lis: temp_sub = [] # 遍历第二层列表 for sub_sub_list in sub_list: temp_sub_sub = [] # 遍历每个元组,过滤指定词性 for token in sub_sub_list: if token[1] != 'NNP': temp_sub_sub.append(token) temp_sub.append(temp_sub_sub) filtered_lis.append(temp_sub)
这段代码和列表推导式的效果完全一致,只是用循环的方式把每一步拆解开了,可读性更强。
内容的提问来源于stack exchange,提问作者meet
相关产品推荐
相关产品推荐

