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

sha*_*adi 1 python list-comprehension list

我试图从列表中提取连续的'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']]
Run Code Online (Sandbox Code Playgroud)

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

[['NNP', 'NN'], ['NN'], ['NNP', 'NN', 'NN']
Run Code Online (Sandbox Code Playgroud)

每个输出块在它们之前发生'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',
  '.']].
Run Code Online (Sandbox Code Playgroud)

如何将结果映射回此列表以便我得到

[['DeNOx', 'activation'], ['order'], ['NSC', 'regeneration', 'management']]
Run Code Online (Sandbox Code Playgroud)

sch*_*ggl 5

你可以使用两个方便itertools:groupbytakewhile:

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']]
Run Code Online (Sandbox Code Playgroud)

这将根据项目TO或以块的形式将块中的初始列表分块IN.从除了第一个块之外的每个块(避免任何初始化NNs),这在它们开始时需要元素NN.最后,它过滤掉了非真实(空)列表.