от
У меня есть список кортежей:
sentenceParts = [('there', 'EX'), ('is', 'VBZ'), ('a', 'DT'), ('huge', 'JJ'), ('shaggy', 'NN'), ('dog', 'NN'), ('in', 'IN'), ('the', 'DT'), ('yard', 'NN')]
Я хочу иметь функцию, при которой, если, например, я знаю, что мне нужно найти значение «IN» (чья клавиша, в данном случае «in»), функция вернет ключ PREVIOUS tuples (в этом примере « собака '), а также числовой индекс ключа этого кортежа (в этом случае я думаю, что это будет 5 [0]) В настоящее время я получаю значение для поиска ('in') из этой строки:
wordIndex = next((word for word, value in sentenceParts if value == "IN"), None)
Эта строка возвращает ключ «in», правильно. Мне нужен аналогичный способ для получения нужного мне результата ('dog', 5 [0] prehaps). Я пробовал возиться с различными версиямиать на фразеParts.index (wordIndex), но я определенно не правильно его использую. Я нашел по крайней мере три разных способа заставить код возвращать «in» мне и несколько десятков способов получить ValueError или AttributeError ... но пока не повезло, когда я обернул голову, возвращая что-то вроде 'dog ', 5 [0] Если бы мне пришлось поместить его в псевдокод, это было бы:
wordIndex = next((PREVIOUS word, INDEX, for word, value in sentenceParts if value == "IN"), None)
Благодарю. Извиняюсь, если об этом уже спрашивали, но я не могу найти ничего, что бы действительно отвечало всем требованиям после значительных поисков ... и, если бы я это увидел, я, возможно, был недостаточно осведомлен, чтобы это распознать. Надеюсь, я не просто пропустил это. Спасибо за любую помощь, которую вы можете предоставить.              

Пожалуйста, войдите или зарегистрируйтесь для публикации ответа на этот вопрос.

4 Ответы

0 голосов
от
Используйте
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]
Использование:
0 голосов
от
Идея состоит в том, чтобы перебирать диграммы, а не отдельные слова, чтобы у вас всегда было предыдущее слово в качестве доступного контекста:
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)
# =
0 голосов
от
[(sentenceParts[i
    
0 голосов
от
Что-то более простое, которое возвращает
None
, если предыдущий ключ не может быть найден (если искомый ключ не найден или находится на первой позиции):
def find_prev( lst, key ):
    try:
        i = [x[1] for x in lst].index(key)
        if i
...