簡體   English   中英

如果滿足某些條件,則從包含元組列表的列表中刪除元組

[英]Remove tuple from list containing list of tuples if certain condition is met

我有一個包含元組列表的列表,該列表是在詞標記器上應用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

嘗試這個:

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

這給您一個列表,而不是列表。 除了你的lis有一些問題,因為沒有,一些元組之間。

錯誤消息表明您正在嘗試訪問對象的第一個列表的第二個(零索引)元素,而該列表只有一個元素。 您的原始代碼只有很少的一個循環,因此由於將列表與字符串進行比較,因此它將始終輸出所有列表。

如果要保留以前的結構,以下代碼應產生預期的輸出(盡管它可能會保留空列表):

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

這將給您您想要的:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM