(Обход) Как решить этот вопрос на python?

#python #list #function #traversal #indexoutofrangeexception

#python #Список #функция #обход #исключение indexoutofrangeexception

Вопрос:

  • Напишите функцию traverse(), которая принимает список tb из n строк, каждая из которых содержит n символов нижнего регистра (a-z).
  • tb представляет квадратную таблицу с n строками и n столбцами. Функция возвращает строку st, сгенерированную приведенной ниже процедурой, которая пересекает сетку, начиная с верхней левой ячейки и заканчивая нижней правой ячейкой.
  • На каждом шаге процедура перемещается либо по горизонтали вправо, либо по вертикали вниз, в зависимости от того, какая из двух ячеек имеет букву «меньше» (т. Е. Букву, которая появляется раньше в алфавитном порядке).
  • Затем буква в посещенной ячейке добавляется в st . В случае связей можно выбрать любое направление.
  • Когда достигнут правый или нижний края таблицы, очевидно, что для перемещения остается только уникальная следующая ячейка. В качестве примера traverse(["veus", "oxde", "oxlx", "hwuj"]) возвращает "veudexj"

таким образом, таблица будет выглядеть следующим образом:

 v  o  o  h
e  x  x  w
u  d  l  u
s  e  x  j
  

Я новичок в python, и я написал этот код … но он печатает только "veuexj" , я бы сказал, проблема в этой строке if new_list[a - 1][b - 1] == new_list[a - 1][-2]: , которая заставляет параметр пропускать 'd' символ. #И я не знаю, как его решить.

 def traverse(tb_list):
    new_list = tb_list.copy()
    st = new_list[0][0]
    parameter = ''
    handler = 1
    for a in range(1, len(new_list)):
        
        for b in range(handler, len(new_list[a])):

            if new_list[a - 1][b - 1] == new_list[a - 1][-2]:
                parameter = new_list[a][b]

            elif new_list[a - 1][b - 1] > min(new_list[a - 1][b], new_list[a][b - 1]):
                parameter = min(new_list[a - 1][b], new_list[a][b - 1])

            elif new_list[a - 1][b - 1] < min(new_list[a - 1][b], new_list[a][b - 1]):
                parameter = min(new_list[a - 1][b], new_list[a][b - 1])

            st  = parameter

        handler = b

    return st


print(traverse(["veus", "oxde", "oxlx", "hwuj"]))
  

Комментарии:

1. И можете ли вы также привести другой пример? Чтобы я мог проверить, работает ли мой код нормально.

2. @Sushil Я протестировал ваш код на некоторых примерах, и он работает нормально… Спасибо за вашу помощь..

3. @Sushil Я попробовал эти примеры, и это работает: 1- traverse([«iman», «abcd», «xolx», «veus»]) возвращает «iabcdxs» 2- traverse([«ball», «carl», «fans», «zero»]) возвращает «baaaero» 3-traverse([«zxyc», «xyoc», «yocb», «ocba»]) возвращает «zxyocba» «

Ответ №1:

Вы можете попробовать что-то вроде этого (объяснение добавлено в качестве комментариев):

 def traverse(tb_list):
    lst = tb_list.copy() #Takes a copy of tb_list
    lst = list(zip(*[list(elem) for elem in lst])) #Transposes the list
    final = lst[0][0] #Sets final as the first element of the list
    index = [0,0] #Sets index to 0,0

    while True:
        x = index[0] #The x coordinate is the first element of the list
        y = index[1] #The y coordinate is the second element of the list

        if x == len(lst) - 1: #Checks if the program has reached the right most point of the table
            if y == len(list(zip(*lst))) - 1: #Checks if program has reached the bottommost point of the table
                return final #If both the conditions are True, it returns final (the final string)
            else:
                final  = lst[x][y 1] #If the program has reached the right most corner, but not the bottommost, then the program moves one step down
                index = [x, y 1] #Sets the index to the new coordinates

        elif y == len(list(zip(*lst))) - 1: #Does the same thing in the previous if condition button in an opposite way (checks if program has reached bottommost corner first, rightmost corner next)
            if x == len(lst) - 1:
                return final
            else:
                final  = lst[x   1][y] #If the program has reached the bottommost corner, but not the rightmost, then the program moves one step right
                index = [x   1, y]

        else: #If both conditions are false (rightmost and bottommost)
            if lst[x 1][y] < lst[x][y 1]: #Checks if right value is lesser than the bottom value
                final  = lst[x 1][y] #If True, then it moves one step right and adds the alphabet at that index to final
                index = [x 1,y] #Sets the index to the new coords
            else: #If the previous if condition is False (bottom val > right val)
                final  = lst[x][y 1] #Moves one step down and adds the alphabet at that index to final
                index = [x,y 1] #Sets the index to the new coords

lst = ["veus", "oxde", "oxlx", "hwuj"]
print(traverse(lst))
  

Вывод:

 veudexj
  

Я добавил объяснение в виде комментариев, поэтому не торопитесь его просматривать. Если вам все еще не ясно с какой-либо частью кода, не стесняйтесь спрашивать меня. Любые предложения по оптимизации / сокращению моего кода приветствуются.