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

标签 python list list-comprehension

我正在尝试从列表中提取连续的“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为此: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']]

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

关于python - 在特定元素的实例之后从列表中提取相同的元素 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48246653/

相关文章:

python - 在 Python 中将具有 1 个变量的列表转换为 float

python - 列表理解分解、解构和/或反汇编

python - 查找两个列表中包含子字符串的元素

Python列表推导式的误解

python - scipy sobel边缘检测,提取外部像素

python - Requests.package.urllib3 错误

python - 如何使用 Numpy 在 Python 中 reshape 数组

python - 表达式的字典列表

python - 深度列表计数 - 列表中的列表计数

静态方法中的python类变量