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

时间:2019-07-05 02:15:57

标签: python list tuples key

我有一个元组列表:

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

我希望有一个函数,例如,如果我知道我需要找到值'IN'(其键在这种情况下为'in'),该函数将返回PREVIOUS元组键(在此例中)例如“ dog”)以及该元组的键的数字索引(在这种情况下,我认为它将是5 [0])

我当前从此行中获取要搜索的值:

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

该行正确返回键“ in”。我需要一种类似的方法来获取所需的输出('dog',5 [0]可能)。我试过弄乱了各个版本的句子部分。索引(wordIndex),但我肯定没有正确使用它。我发现至少有三种方法可以使代码返回“ in”给我,还有几十种方法可以获取ValueError或AttributeError ...但运气还不佳,因为我的脑袋全都返回了“ dog”之类的东西',5 [0]

如果我不得不将其放入伪代码中,它将是:

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

谢谢。抱歉,是否曾经有人问过这个问题,但是经过大量搜索之后,我找不到真正符合要求的内容……如果我确实看到它,可能我并不了解它。希望我不只是想念它。感谢您提供的任何帮助。

4 个答案:

答案 0 :(得分:2)

在压缩列表中使用> global.page.goto('http://stackoverflow.com') Promise { <pending> } zip

enumerate

用法

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]

答案 1 :(得分:1)

想法是遍历语法,而不是单个单词,因此您始终将前面的单词用作可用上下文:

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)

答案 2 :(得分:0)

[(sentenceParts[i-1][0], i-1) for i, (w,t) in enumerate(sentenceParts) if t == 'IN' and i >0]


[('dog', 5)]

答案 3 :(得分:0)

更简单的方法,如果找不到先前的键(如果找不到要搜索的键或位于第一位置,则返回None

def find_prev( lst, key ):
    try:
        i = [x[1] for x in lst].index(key)
        if i > 0:
            return (i-1,lst[i-1][0])
    except:
        pass
    return None