Как устранить ошибку «TypeError: строковые индексы должны быть целыми числами»?

1
def closest(s, queries):
    for query in queries:
        c = s[query]
        for i in s[query:]:
            if s[i] == c:
                return i
            else:
                return -1

В приведенном выше коде у меня есть строка s= "abcaccba" (скажем), и у меня есть массив индексов, запросов = [1, 3, 2]. Я пытаюсь найти самое близкое появление символа по этим индексам.

Например: s[1] = b и ближайший индекс, в котором второе вхождение b, равно 6. Когда я пытаюсь запустить код выше, я получаю эту ошибку:

File "solution.py", line 23, in closest
    if s[i] == c:
TypeError: string indices must be integers

Что я здесь делаю неправильно?

  • 0
    Ваш i - это символ из строки s , а не целое число.
  • 3
    Попробуйте for i in range(len(s[query:])):
Показать ещё 4 комментария
Теги:
string
arrays
indexing

3 ответа

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

Вы можете использовать метод find() для поиска позиций символов в строке.

Посмотрите на сегменты строк вперед и назад каждого символа query -indexed. Затем используйте их относительное положение, чтобы определить их истинный индекс в s.

s = "abcaccbaz"
queries = [1, 3, 2, 0, 5, 6, 8]
closest = []

for q in queries:
    char = s[q]
    pre = s[:q][::-1] # reversed, so nearest character to char is first
    post = s[q+1:]

    pre_dist = pre.find(char) 
    pre_found = pre_dist >= 0

    post_dist = post.find(char) 
    post_found = post_dist >= 0

    if post_found and (post_dist <= pre_dist or not pre_found):
        closest.append(post_dist + len(pre) + 1)
    elif pre_found and (pre_dist <= post_dist or not post_found):
        closest.append(q - pre_dist - 1)
    else:
        closest.append(None)

closest
# [6, 0, 4, 3, 4, 1, None]

Я добавил дополнительный край, z, чтобы покрыть случай, когда нет дополнительных экземпляров этого символа. В этом случае процедура возвращает None.

0

Ошибка, которую вы получаете, заключается в том, что i - это string но индексы должны быть integers. (Это должно быть ясно из сообщения об ошибке). Изменение части, if s[i] ==c: to if я == c: сделает ваш код запущенным, но я не думаю, что он даст вам ответ, который вы действительно ищете.

Поскольку вам нужен самый близкий индекс, в котором символ совпадает с символом индекса запроса, я думаю, вы должны получить список результатов, который должен быть до тех пор, пока len ваших queries. Ниже приведен код, который поможет вам достичь этой цели. Я также расширил ваш пример, чтобы улучшить понимание.

s = "abcaccba" 
queries = [1,3,2,0, 5]
def closest(s, queries):
    print('String: ', s)
    print('Query: ', queries)
    results = []
    for query in queries:
        c = s[query]
        if s[query] in s[query+1 :]:
            results.append(('query = {}'.format(query), 'character = {}'.format(c), 'index of next occurrence = {}'.format(1+query+s[query+1 :].index(c))))
            #results.append((query, c, 1+query+s[query+1 :].index(c)))
        else:
            results.append(('query = {}'.format(query), 'character = {}'.format(c), 'index of next occurrence = {}'.format(-1)))
            #results.append((query, c, -1))
    return results
closest(s  = s, queries =  queries) 

Вот результат

String:  'abcaccba'
Query:  [1, 3, 2, 0, 5]

[('query = 1', 'character = b', 'index of next occurrence = 6'),
 ('query = 3', 'character = a', 'index of next occurrence = 7'),
 ('query = 2', 'character = c', 'index of next occurrence = 4'),
 ('query = 0', 'character = a', 'index of next occurrence = 3'),
 ('query = 5', 'character = c', 'index of next occurrence = -1')]
  • 1
    Извините @ Rabbid76, я по ошибке нажал кнопку ответа на пост. Я разместил свой ответ сейчас.
0

i уже символ в строке. Вам просто нужно изменить s[i] на i и вычислить положение символа.

def closest(s, queries):
    for query in queries:
        c = s[query]
        for i in s[query:]:
            if i == c: # i is a char , i = s[position]
                print( i,(s[query+1:].index(i)+query+1) )
                break
            else:
                pass

s = "abcaccba"
queries = [1, 3, 2]
closest(s, queries)

Ещё вопросы

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