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)
你可以使用两个方便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']]
Run Code Online (Sandbox Code Playgroud)
这将根据项目TO或以块的形式将块中的初始列表分块IN.从除了第一个块之外的每个块(避免任何初始化NNs),这在它们开始时需要元素NN.最后,它过滤掉了非真实(空)列表.
| 归档时间: |
|
| 查看次数: |
67 次 |
| 最近记录: |