Skip to main content
 首页 » 编程设计

python之在特定元素的实例之后从列表中提取相同的元素 block

2025年05月04日12qq78292959

我正在尝试从列表中提取连续的“NN”元素(包括“NNP”)并附加到新列表,因为在“NN”之前遇到了“IN”或“TO”。我该怎么做?

我尝试了以下代码。但无法捕获其他类似实例。

    new = ['JJ', 
 'NN', 
 'IN', 
 'NNP', 
 'NN', 
 'MD', 
 'VB', 
 'VBN', 
 'IN', 
 'NN', 
 'TO', 
 'VB', 
 'NN', 
 'CC', 
 'NN', 
 'TO', 
 'NNP', 
 'NN', 
 'NN', 
 '.'] 
 
lst = [] 
for i,j in enumerate(new): 
    lst1 = [] 
    if j == 'IN': 
        for i in new[i+1:]: 
            if 'NN' in i: 
                lst1.append(i) 
                lst.append(lst1) 
                break 
 
lst = [['NNP'], ['NN']] 

但我想改进代码以提供以下输出:

[['NNP', 'NN'], ['NN'], ['NNP', 'NN', 'NN'] 

每个输出 block 之前都出现了“IN”或“TO”。

实际上,上面的列表(新的)是这个列表的基础词性:

[['Additional', 
  'condition', 
  'of', 
  'DeNOx', 
  'activation', 
  'shall', 
  'be', 
  'introduced', 
  'in', 
  'order', 
  'to', 
  'provide', 
  'flexibility', 
  'and', 
  'robustness', 
  'to', 
  'NSC', 
  'regeneration', 
  'management', 
  '.'], 
 ['JJ', 
  'NN', 
  'IN', 
  'NNP', 
  'NN', 
  'MD', 
  'VB', 
  'VBN', 
  'IN', 
  'NN', 
  'TO', 
  'VB', 
  'NN', 
  'CC', 
  'NN', 
  'TO', 
  'NNP', 
  'NN', 
  'NN', 
  '.']]. 

我怎样才能将结果映射回这个列表,这样我就可以得到

[['DeNOx', 'activation'], ['order'], ['NSC', 'regeneration', 'management']] 

请您参考如下方法:

您可以使用两个方便的 itertools为此:groupby和 takewhile :

from itertools import groupby, takewhile 
 
nn = lambda x: x.startswith('NN') 
to_in = lambda x: x in ('IN', 'TO') 
 
list(filter(None, [list(takewhile(nn, g)) for k, g in groupby(new, key=to_in)][1:])) 
# [['NNP', 'NN'], ['NN'], ['NNP', 'NN', 'NN']] 

这会根据TO 或IN 中的项目将初始列表分块。从除第一个 block 之外的每个 block (为了避免任何初始 NN),这会获取以 NN 开头的元素。最后,它filters出非真实(空)列表。