Найти начало индекса фразы в списке - PullRequest
0 голосов
/ 30 августа 2018

Если у меня есть этот список:

text = ['Malte', 'ex', 'precio', 'empcionis', 'bovum', 'septem',  'laborancium', 'et', 'unius', 'thaurj', 'et', 'unius', 'vacce', 'cum', 'vitulo', 'sequenti', 'et', 'pecudum', 'fetancium', 'sexdecim', 'et', 'duarum', 'caprarum', 'cum', 'duobus', 'et', 'cum', 'vitulo']

И я хочу найти каждый индекс начала 'cum vitulo', то есть: 13 и 26.

В данный момент у меня начинается начало 'cum', но иногда за этим следует другое слово ex: в данном случае 'duobus'

Ответы [ 3 ]

0 голосов
/ 30 августа 2018
text = ['Malte', 'ex', 'precio', 'empcionis', 'bovum', 'septem',  'laborancium', 'et', 'unius', 'thaurj', 'et', 'unius', 'vacce', 'cum', 'vitulo', 'sequenti', 'et', 'pecudum', 'fetancium', 'sexdecim', 'et', 'duarum', 'caprarum', 'cum', 'duobus', 'et', 'cum', 'vitulo']

result = []
for index, value in enumerate(text):
    if value == 'cum':
        try:
             if text[index + 1] == 'vitulo':
                 result.append(index)
        except IndexError:  # reached end
            break

выход

result == [13, 26]

Необычный способ:

from itertools import tee

# recipe from itertools
def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = tee(iterable)
    next(b, None)
    return zip(a, b)


[index for (index, (first, second)) in enumerate(pairwise(text)) if first == 'cum' and second == 'vitulo']
0 голосов
/ 30 августа 2018

Это самый простой способ ИМХО (python 2.7 и 3):

text = ['Malte', 'ex', 'precio', 'empcionis', 'bovum', 'septem',  'laborancium', 'et', 'unius', 'thaurj', 'et', 'unius', 'vacce', 'cum', 'vitulo', 'sequenti', 'et', 'pecudum', 'fetancium', 'sexdecim', 'et', 'duarum', 'caprarum', 'cum', 'duobus', 'et', 'cum', 'vitulo'];

result = [i for i, item in enumerate(text[:-1]) if item == 'cum' and text[i+1] == 'vitulo']
print(result)  # >>> [13, 26]
0 голосов
/ 30 августа 2018

Один из способов сделать это был бы так:

text = ['Malte', 'ex', 'precio', 'empcionis', 'bovum', 'septem',  'laborancium', 'et', 'unius', 'thaurj', 'et', 'unius', 'vacce', 'cum', 'vitulo', 'sequenti', 'et', 'pecudum', 'fetancium', 'sexdecim', 'et', 'duarum', 'caprarum', 'cum', 'duobus', 'et', 'cum', 'vitulo']

target = 'cum vitulo'
target = tuple(target.split())
hits = [i for i, x in enumerate(zip(text, text[1:])) if x == target]
print(hits)  # -> [13, 26]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...