首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在特定元素的实例之后从列表中提取相同的元素块

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

Stack Overflow用户
提问于 2018-01-14 04:18:02
回答 3查看 73关注 0票数 1

我试图从列表中提取顺序的'NN‘元素(包括'NNP'),并在“NN”之前添加到一个新的列表中,即“IN”或“to”。我该怎么做呢?

我尝试了下面的代码。但无法捕捉到其他类似的例子。

代码语言:javascript
复制
    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']]

但是,我希望改进代码以提供以下输出:

代码语言:javascript
复制
[['NNP', 'NN'], ['NN'], ['NNP', 'NN', 'NN']

每个输出块都有“IN”或“TO”出现在它们之前。

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

代码语言:javascript
复制
[['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',
  '.']].

如何将结果映射回此列表,以便获得

代码语言:javascript
复制
[['DeNOx', 'activation'], ['order'], ['NSC', 'regeneration', 'management']]
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-01-14 04:48:31

你的不太远。使这更容易的一种方法是获取'IN''TO'的所有索引。

代码语言:javascript
复制
starts = {'IN', 'TO'}
in_twos = [i for i, e in enumerate(new) if e in starts]

这意味着:

代码语言:javascript
复制
[2, 8, 10, 15]

然后,只需迭代这些索引,特别是new[i+1:],并接受'NN''NNP'元素。当您到达一个不是这些元素的元素时,break退出循环。

下面是一个示例:

代码语言:javascript
复制
result = []
take = {'NN', 'NNP'}

for i in in_twos:
    temp = []
    for x in new[i+1:]:
        if x not in take:
            break

        temp.append(x)

    # If this is empty, don't add it
    if temp:
        result.append(temp)

print(result)

其最终结果是:

代码语言:javascript
复制
[['NNP', 'NN'], ['NN'], ['NNP', 'NN', 'NN']]

另一种更短的方法,如@schwobaseggl所建议的,是使用itertools.takewhile使提取'NN'元素更容易。这个函数基本上一直提取元素,直到第一个参数谓词返回false为止。

以下是它的样子:

代码语言:javascript
复制
from itertools import takewhile

# new, take and in_twos same as before

result = [l for l in [list(takewhile(lambda x: x in take, new[i+1:])) for i in in_twos] if l]

print(result)
# [['NNP', 'NN'], ['NN'], ['NNP', 'NN', 'NN']]

更新:

如果你想把单词和演讲放在一起,你可以这样做:

代码语言:javascript
复制
new = [['JJ', 'NN', 'IN','NNP','NN','MD','VB','VBN','IN','NN','TO','VB','NN','CC','NN','TO','NNP','NN','NN','.'],
   ['Additional','condition','of','DeNOx','activation','shall','be','introduced','in', 'order','to','provide','flexibility','and','robustness', 'to','NSC','regeneration','management','.']]

starts = {'IN', 'TO'}
in_twos = [i for i, e in enumerate(new[0]) if e in starts]

speech = []
words = []
take = {'NN', 'NNP'}

for i in in_twos:
    temp = []
    for x, y in zip(new[0][i+1:], new[1][i+1:]):
        if x not in take:
            break

        temp.append((x, y))

    # If this is empty, don't add it
    if temp:
        speech.append([x for x, _ in temp])
        words.append([y for _, y in temp])

print(speech)
print(words)

其中产出:

代码语言:javascript
复制
[['NNP', 'NN'], ['NN'], ['NNP', 'NN', 'NN']]
[['DeNOx', 'activation'], ['order'], ['NSC', 'regeneration', 'management']]
票数 1
EN

Stack Overflow用户

发布于 2018-01-14 04:28:52

为此您可以使用两个方便的迭代工具群比外卖

代码语言:javascript
复制
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项的块的初始列表。除了第一个块(为了避免任何初始的NNs)之外,每个块都需要元素,而元素是从NN开始的。最后,它过滤器出不真实(空)列表。

票数 5
EN

Stack Overflow用户

发布于 2018-01-14 04:31:32

在我输入时,还有另一个很好的答案--这是一个没有导入的简单实现。

代码语言:javascript
复制
full_list = []

for x in range(0, len(new)):
    if 'NN' in new[x] and ('IN' in new[x-1] or 'TO' in new[x-1]):
        temp_list = [new[x]]
        temp_index = x+1
        while 'NN' in new[temp_index]:
            temp_list.append(new[temp_index])
            temp_index += 1
        full_list.append(temp_list)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48246653

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档