Использование itertools для условия с перечислением для получения только определенных индексов списка (python)

1

Это мой код:

from itertools import tee, islice, chain

def previous_and_next(some_iterable):
   prevs, items, nexts = tee(some_iterable, 3)
   prevs = chain([None], prevs)
   nexts = chain(islice(nexts, 1, None), [None])
   return zip(prevs, items, nexts)

fruits = ['watermelon', 'apple', 'apple', 'banana', 'kiwi', 'peach', 'apple',
          'pear', 'watermelon', 'apple', 'apple', 'orange', 'apple', 'grape']

nr_of_apples = 0
apples = []

for previous, item, nxt in previous_and_next(fruits):
    apple_indexes = [i for i, x in enumerate(fruits) if x == 'apple' and nxt != 'apple']
print(apple_indexes)

for i in apple_indexes:
    index = i - 1
    for previous, item, nxt in previous_and_next(fruits[index:]):
        if nxt != 'apple':
            break
        apples.append(nxt)

nr_of_apples = len(apples)

print(nr_of_apples)

Я пытаюсь подсчитать количество раз, когда слово "яблоки" появляется в списке с помощью itertools. Я знаю, что это сложный способ сделать что-то, что может быть достигнуто в этом, гораздо проще:

for f in fruits:
    if f == 'apple':
        apples.append(f)

Но идея здесь состоит в том, чтобы расширить этот код для гораздо более сложного использования с помощью Stanford CoreNLP Named Entity Recognition. Поэтому я начинаю просто и строю свой путь к этому.

Проблема в том, что мой код в настоящее время возвращает это:

[1, 2, 6, 9, 10, 12]  # indexes of the apples
8  # number of apples

Очевидно, что в списке нет 8 яблок, всего 6. Итак, мой вопрос: как добавить условие в функцию перечисления, чтобы получить индексы яблок, которые не следуют за другим яблоком? Таким образом, результат должен выглядеть следующим образом:

[1, 6, 9, 12]
6
Теги:
list-comprehension
itertools
enumerate

1 ответ

1
Лучший ответ

попробуйте что-то вроде этого,

In [160]: list_of_index = [i for i,j in enumerate(fruits) if j == 'apple']

In [161]: print list(set([min(i) if i[1] - i[0] == 1 else max(i) for i in zip(list_of_index,list_of_index[1:])]))
[1, 12, 6, 9]

In [162]: print fruits.count('apple')
6
  • 1
    Работал отлично, спасибо! :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню