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