#python #list
#python #Список
Вопрос:
Я пишу программу, которая имитирует базовый марсоход. Матрица — это «марс», где первые два числа — это координаты x и y, а третье — показатель безопасности, который определяет, является ли данная координата судоходной (0-плохо 4-хорошо). «Ровер» может перемещаться только прямо вправо или вниз (начало -0,0 и конец -3,3). Моя программа может определить, какие координаты безопасны, но я изо всех сил пытаюсь найти способ сравнить их, чтобы найти безопасный путь. Мне нужно найти способ сравнить отображаемые выходные данные, чтобы координата x или y изменялась только на единицу (вправо или вниз) для определения пути.
# This is mars
matrix = [[0, 0, 1], [0, 1, 4], [0, 2, 1], [0, 3, 0],
[1, 0, 1], [1, 1, 1], [1, 2, 0], [1, 3, 1],
[2, 0, 0], [2, 1, 1], [2, 2, 1], [2, 3, 2],
[3, 0, 0], [3, 1, 0], [3, 2, 1], [3, 3, 1]]
# This decides if a given coordinate is safe
def is_safe(sublist):
if sublist[2::3] == [0]:
return False
else:
return True
# As of now this just stores safe coordinates in a list
def find_paths():
for sublist in matrix:
if is_safe(sublist):
safepath.append(sublist)
safepath = []
find_paths()
print(safepath)
Вывод:
[[0, 0, 1], [0, 1, 4], [0, 2, 1], [1, 0, 1], [1, 1, 1], [1, 3, 1], [2, 1, 1],
[2, 2, 1], [2, 3, 2], [3, 2, 1], [3, 3, 1]]
Комментарии:
1.
sublist[2::3]
должно бытьsublist[2:3]
. Но это всего лишь один элемент, так почему бы и нетif sublist[2] == 0:
?2. Совет:
if something: return True; else: return False
может быть простоreturn something
. И если вы измените два возврата, это может бытьreturn not something
3. Ваша структура данных не кажется очень полезной для поиска путей. Было бы лучше, если бы у вас была 2-мерная структура, где индексы — это координаты, а не список координат.
4. Затем вы можете найти соседние местоположения, просто добавляя и вычитая из индексов.
5. Используйте рекурсивный алгоритм. Базовый вариант таков
[3,3]
: когда вы доберетесь туда, вы закончите. Найдите координату справа. Если это безопасно, выполните рекурсию из него. Найдите координату вниз. Если это безопасно, выполните рекурсию из него.
Ответ №1:
В качестве примера по комментариям Бамара:
m = {}
for x,y,z in matrix:
entry = m.get(x, {})
entry[y] = z
m[x] = entry
m[0][0] # outputs 1; i.e. m now contains matrix in normalized form
Теперь ваша проблема заключается в перемещении в традиционной 2D-матрице, а не в странном разборе списка.