Python - индекс в строке для соответствующего слова - PullRequest
0 голосов
/ 24 февраля 2020

Я ищу эффективный способ преобразования индекса в строке в слово, в котором находится индекс.

Например, если это моя строка:

This is a very stupid string

и индекс, который я получаю, скажем, 10, поэтому результат должен быть very. Также, если индекс равен 11,12 или 13 - вывод должен быть very.

Можно предположить, что слова каждый раз разделяются на 1 пробел. Делать это с помощью для l oop или чего-то несложного, вопрос в том, существует ли более эффективный способ (так как мой текст ОГРОМНЫЙ, и у меня МНОГИЕ индексы для преобразования в слова).

Для примера, пусть индексы будут 10, 13, 16, и, следовательно, выходные данные должны быть:

10 very
13 very
16 stupid

Любая помощь будет оценена!

Ответы [ 3 ]

1 голос
/ 24 февраля 2020

Следующее должно работать довольно хорошо. Начните с получения слов в строке, используя split, и найдите индекс, с которого они начинают использовать enumerate, и понимание списка:

words = s.split()
# ['This', 'is', 'a', 'very', 'stupid', 'string']
# Obtain the indices where all words begin
ix_start_word = [i+1 for i,s in enumerate(s) if s==' ']
# [5, 8, 10, 15, 22]

И теперь вы можете использовать NumPy's np.searchsorted для получения слова с указанным индексом:

words[np.searchsorted(ix_start_word, ix)]

Проверка с примерами выше:

words[np.searchsorted(ix_start_word, 11)]
#'very'

words[np.searchsorted(ix_start_word, 13)]
# 'very'

words[np.searchsorted(ix_start_word, 16)]
# 'stupid'
0 голосов
/ 24 февраля 2020

Это не очень эффективно, поскольку используется регулярное выражение, но это один из способов решения проблемы без использования циклов.

import re

def stuff(pos):
    x = "This is a very stupid string"
    pattern = re.compile(r'\w+\b')
    pattern2 = re.compile(r'.*(\b\w+)')
    end = pattern.search(x, pos=pos).span()[1]
    print(pattern2.search(x, endpos=end).groups()[0])

stuff(2)
stuff(10)
stuff(11)
stuff(16)

Результаты:

This
very
very
stupid
0 голосов
/ 24 февраля 2020

Я не особо горжусь, насколько это чисто, но я думаю, что это помогает:

from numpy import cumsum, array

sample = 'This is a very stupid string'

words = sample.split(' ')
lens = [len(_)+1 for _ in words]

ends = cumsum(lens)
starts = array([0] + list(ends[:-1]))

output = {}
for a, b, c in zip(starts, ends, words):
    for i in range(a, b):
        output[i] =  c
for a, b in output.items():
    print(a, b)
0 This
1 This
2 This
3 This
4 This
5 is
6 is
7 is
8 a
9 a
10 very
11 very
12 very
13 very
14 very
15 stupid
16 stupid
17 stupid
18 stupid
19 stupid
20 stupid
21 stupid
22 string
23 string
24 string
25 string
26 string
27 string
28 string
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...