найти индекс символа в строковом элементе двусвязного списка без использования классов в python - PullRequest
0 голосов
/ 09 ноября 2018

Я пишу скрипт некоторых полезных функций для редактирования двусвязных списков, и я не использую ООП. Так что никакие классы не используются.

Вот пример двусвязного списка:

dll = ['So true', ['^very much', ['try it', ['Not yet', None, [...]], [...]], [...]], None]

Обратите внимание, что структура элементов ddl выглядит следующим образом: [строка, указатель на предыдущий узел, указатель на следующий узел]

Я пытаюсь создать переменную, которая имеет значение символа '^' в двусвязном списке как «курсор» (просто виртуальный курсор, но на самом деле это просто индекс '^' символа), без использования классов (функция или пара функций может быть?). Теперь переменная курсора является указателем на узел (содержащий текущую строку) и позицию в этой строке.

Причина, по которой я хочу его создать, состоит в том, чтобы использовать его для создания полезных функций, таких как: перемещение курсора на один символ влево, перемещение курсора в начало строки и т. Д.

курсор = индекс '^' в двусвязном списке со строками.

Итак, мой вопрос: как найти индекс символа в строке в двусвязном списке без использования классов?

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

Прежде всего, вот функция, которая создает двойной связанный список из списка элементов. Допустим, у нас есть список строковых элементов:

testList =['A lot', 'Very ^much', 'Try it', 'Nop']

Теперь, чтобы построить двусвязный список из testList, мы делаем это следующим образом:

# Build node function
def getNode(data):
    return [data, None, None]

# Build the doubly linked list
def construct_double_list(testList):
    nxt, prvs = 1, 2
    start, end = None, None
    for line in testList:
        next_node = getNode(line)
        if start is not None:
            end[nxt] = next_node
            next_node[prvs] = end
            end = next_node
        else:
            start = next_node
            end = next_node
    return start, end

Если вы запустите построитель функций, приведенный выше, двусвязный список (повторяемый в обоих направлениях) будет:

dll = dll = ['A lot', ['Very ^much', ['Try it', ['Nop', None, [...]], [...]], [...]], None]

Я уже делал это вчера, но сегодня утром я застрял, пытаясь решить проблему с курсором. Через некоторое время я получил его на работу только сейчас (наконец-то!). Вот функция, которая создает курсор в виде указателя на узел (содержащий текущую строку) и позицию в этой строке следующим образом:

def cursor():
    cursor = (None, None)
    start, end = construct_double_list(testList)
    node = start
    while node is not None:
        line = node[0]
        if '^' in line:
            pointer1 = node
            pointer2 = line.index('^')
        node = node[1]
    cursor = (pointer1, pointer2)
    return cursor

Если вы печатаете функцию cursor() выше:

print(cursor())

Вы получаете:

(['Very ^much', ['Try it', ['Nop', None, [...]], [...]], ['A lot', [...], None]], 5)
# Node 1 and string index 5

Теперь я могу создавать некоторые полезные функции для редактирования данных, изменения, добавления, удаления, замены элементов, замены символов в строковых элементах двусвязного списка и т. Д.

0 голосов
/ 09 ноября 2018

Чтобы просто найти положение символа ^, вы можете использовать простую рекурсивную функцию для объединения всех строк (я предполагаю, что все строки находятся в позиции 0 во вложенных списках):

def join_nested_strings(list):
    if list[1]:
        return list[0] + join_nested_strings(list[1])
    else:
        return list[0]

, а затем просто найдите индекс с помощью print(join_nested_strings(dll).index("^")).

EDIT:

Если вы хотите получить результат в виде кортежа (строка, индекс), рекурсивная функция будет выглядеть следующим образом:

def cursor(list):
    if "^" in list[0]:
        return list[0], list[0].index("^")
    else:
        return cursor(list[1])

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

...