Python:在元组列表中,当找到下一个元组的值时,检索上一个元组的键?

2024-10-03 09:20:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个元组列表:

sentenceParts = [('there', 'EX'), ('is', 'VBZ'), ('a', 'DT'), ('huge', 'JJ'), ('shaggy', 'NN'), ('dog', 'NN'), ('in', 'IN'), ('the', 'DT'), ('yard', 'NN')]

我希望有一个函数,例如,如果我知道我需要找到值'IN'(其键在本例中为'IN'),该函数将返回上一个元组键(在本例中为'dog')以及该元组键的数字索引(在本例中,我相信它将是5[0])

我当前从此行获取要搜索的值(“in”):

wordIndex = next((word for word, value in sentenceParts if value == "IN"), None)

那一行正确地返回了“in”键。我需要一个类似的方法来获得我需要的输出('dog',5[0]prehaps)。我试过搞乱各种版本的sentenceParts.index(wordIndex),但我肯定用得不对。我已经找到了至少三种不同的方法来让代码返回给我,还有几十种方法来获得ValueError或AttributeError。。。但我的头缠着它还不走运,像“狗”,5[0]

如果我必须将其放入伪代码中,它将是:

wordIndex = next((PREVIOUS word, INDEX, for word, value in sentenceParts if value == "IN"), None)

谢谢。抱歉,如果有人问过这个问题,但我找不到任何真正符合法案后,大量搜索。。。如果我真的看到了,我可能还没有足够的知识去认识它。希望我没有错过。谢谢你的帮助


Tags: 方法函数inforvaluedtnnword
3条回答

在压缩列表上使用zipenumerate

def get_previous_item(lst, search_item):
    for i, (x, y) in enumerate(zip(lst, lst[1:])):
        if y[1] == search_item:
            return i, x[0]

用法:

>>> get_previous_item(sentenceParts, 'IN')
(5, 'dog')

其思想是在digrams上迭代,而不是单个单词,因此您始终可以将前面的单词作为可用上下文:

words = [('there', 'EX'), ('is', 'VBZ'), ('a', 'DT'), ('huge', 'JJ'), ('shaggy', 'NN'), ('dog', 'NN'), ('in', 'IN'), ('the', 'DT'), ('yard', 'NN')]
next(((token1, i)
      for i, ((token1, pos1), (token2, pos2))
      in enumerate(zip(words, words[1:]))
      if pos2 == 'IN'
     ), None)
# => ('dog', 5)
[(sentenceParts[i-1][0], i-1) for i, (w,t) in enumerate(sentenceParts) if t == 'IN' and i >0]


[('dog', 5)]

相关问题 更多 >