如果满足某些条件,则从包含元组列表的列表中删除元组

时间:2018-04-23 17:43:49

标签: python list tuples pos-tagger

我有一个列表,其中包含在word tokenizer上应用postag后获得的元组列表。样本是

    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')]]]

我想在元组的第二个元素是'NNP'时删除元组.OutputList看起来像这样;

    Final_lis=[[[('This', 'DT')]],[[('Can', 'MD'), ('lambast', 'VB'), ('up', 'RP')]]]

我正在编写代码:

   print(len(lis[0][1])) #to print the length of first list containing tuples        
   f_list=[]
   for i in range(0,len(lis)):
       for j in range(len(lis[l])):
           if lis[i][j][1]!='NNP':
              f_list.append(lis[i][j])

但它显示错误

    Traceback (most recent call last):
    File "<ipython-input-51-02562b867f97>", line 1, in <module>
runfile('C:/Users/meet/t1.py', wdir='C:/Users/meet')

    File "C:\Users\meet\Anaconda3\lib\site- 
   packages\spyder\utils\site\sitecustomize.py", line 880, in runfile
       execfile(filename, namespace)

     File "C:\Users\meet\Anaconda3\lib\site- 
   packages\spyder\utils\site\sitecustomize.py", line 102, in execfile
       exec(compile(f.read(), filename, 'exec'), namespace)

     File "C:/Users/meet/t1.py", line 9, in <module>
       print(len(lis[0][1]))

    IndexError: list index out of range

3 个答案:

答案 0 :(得分:1)

试试这个:

flist = []
for j in lis:
    for k in j:
        for l in k:
            if l[1] != 'NNP':
                flist.append(l)
print(flist)

这为您提供了单个列表,而不是列表列表。除了lis之外,还有一些问题,因为某些元组之间没有,

答案 1 :(得分:0)

错误消息表明您正在尝试访问对象的第一个列表的第二个(零索引)元素,而此列表只有一个元素。 您的原始代码有一个循环到少数,因此它将始终输出所有列表,因为将列表与字符串进行比较。

如果您想保留以前的结构(可能会保留空列表),以下代码应该会产生预期的输出:

f_list = [
    [
        [
            (val, tag) for val, tag in inner_list if tag != 'NNP'
        ] for inner_list in outer_list
    ]
    for outer_list in lis
]
# result: [[[('This', 'DT')]], [[('Can', 'MD'), ('lambast', 'VB'), ('up', 'RP')]]]

如果您只需要一个元组列表,则以下代码段将给出预期结果:

f_list = [
    (val, tag)
    for outer_list in lis
    for inner_list in outer_list
    for val, tag in inner_list
    if tag != 'NNP'
]
# result: [('This', 'DT'), ('Can', 'MD'), ('lambast', 'VB'), ('up', 'RP')]

答案 2 :(得分:0)

这会给你你想要的东西:

result = [[filter(lambda x: x[1] != 'NNP', a[0])] for a in lis]