我有一个元组列表:
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)
谢谢。抱歉,是否曾经有人问过这个问题,但是经过大量搜索之后,我找不到真正符合要求的内容……如果我确实看到它,可能我并不了解它。希望我不只是想念它。感谢您提供的任何帮助。
答案 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