Форум сайта python.su
0
Есть функция neighbors(cell) которая создает список кортежей. Однако в кортежах значения должны быть только от 0 до N-1. Я написал код, однако он не убирает все кортежи с такими значениями за один раз.
def neighbors(cell,N):
paths = [(cell[0] + 1, cell[1]),
(cell[0], cell[1] + 1),
(cell[0], cell[1] - 1),
(cell[0] + 1, cell[1] + 1),
(cell[0] + 1, cell[1] - 1),
(cell[0] - 1, cell[1]),
(cell[0] - 1, cell[1] - 1),
(cell[0] - 1, cell[1] + 1)]
for i in paths:
if i[0] < 0 or i[0] > N - 1 or i[1] < 0 or i[1] > N-1:
paths.remove(i)
for i in paths:
if i[0] < 0 or i[0] > N - 1 or i[1] < 0 or i[1] > N-1:
paths.remove(i)
return paths
Офлайн
20
Воспользуйтесь функцией any()
for i in paths: if any((i[0] < 0, i[0] > N-1, i[1] < 0, i[1] > N-1)): paths.remove(i)
Отредактировано old_monty (Янв. 8, 2017 18:33:30)
Офлайн
0
old_montyПроверил, все равно выводит значения которые не могут быть:
Воспользуйтесь функцией any()
paths = [(cell[0] + 1, cell[1]),
(cell[0], cell[1] + 1),
(cell[0], cell[1] - 1),
(cell[0] + 1, cell[1] + 1),
(cell[0] + 1, cell[1] - 1),
(cell[0] - 1, cell[1]),
(cell[0] - 1, cell[1] - 1),
(cell[0] - 1, cell[1] + 1)]
for i in paths:
if any((i[0] < 0, i[0] > N - 1, i[1] < 0, i[1] > N - 1)):
paths.remove(i)
return paths
Отредактировано ProPall (Янв. 8, 2017 18:48:12)
Офлайн
20
ProPallЭто же еще зависит от значения N. А в проверке условия с any() вроде нет ошибки.
Проверил, все равно выводит значения которые не могут быть
Если cell - (0,0)
Выводит - (1, 0), (0, 1), (1, 1), (-1, 0), (-1, 1)
Отредактировано old_monty (Янв. 8, 2017 19:22:49)
Офлайн
0
old_montyN = 5
paths = [(cell[0] + 1, cell[1]),
(cell[0], cell[1] + 1),
(cell[0], cell[1] - 1),
(cell[0] + 1, cell[1] + 1),
(cell[0] + 1, cell[1] - 1),
(cell[0] - 1, cell[1]),
(cell[0] - 1, cell[1] - 1),
(cell[0] - 1, cell[1] + 1)]
for i in paths:
if i[0] < 0 or i[0] > N - 1 or i[1] < 0 or i[1] > N-1:
paths.remove(i)
for i in paths:
if i[0] < 0 or i[0] > N - 1 or i[1] < 0 or i[1] > N-1:
paths.remove(i)
for i in paths:
if i[0] < 0 or i[0] > N - 1 or i[1] < 0 or i[1] > N-1:
paths.remove(i)
return paths
Офлайн
20
Нашел я в чем тут ошибка. Удаление элемента из списка изменяет этот список, и на каждом шаге for элементы списка изменяются. Программа правильно работает, если сделать так:
def neighbors(cell,N): paths = [(cell[0] + 1, cell[1]), (cell[0], cell[1] + 1), (cell[0], cell[1] - 1), (cell[0] + 1, cell[1] + 1), (cell[0] + 1, cell[1] - 1), (cell[0] - 1, cell[1]), (cell[0] - 1, cell[1] - 1), (cell[0] - 1, cell[1] + 1)] newpaths = [i for i in paths if not any((i[0] < 0, i[0] > N-1, i[1] < 0, i[1] > N-1))] return newpaths def main(): N = 5 cell = (0, 0) print(neighbors(cell, N)) if __name__ == '__main__': main()
Отредактировано old_monty (Янв. 8, 2017 20:36:39)
Офлайн
76
Чтобы работал Ваш код можно сделать полную копию списка, чтобы при вызове remove() не изменять список, в котором выполняются итерации
import copy def f(cell, N): paths = [(cell[0] + 1, cell[1]), (cell[0], cell[1] + 1), (cell[0], cell[1] - 1), (cell[0] + 1, cell[1] + 1), (cell[0] + 1, cell[1] - 1), (cell[0] - 1, cell[1]), (cell[0] - 1, cell[1] - 1), (cell[0] - 1, cell[1] + 1)] res = copy.deepcopy(paths) for i in res: if i[0] < 0 or i[0] > N - 1 or i[1] < 0 or i[1] > N-1: paths.remove(i) return paths
Офлайн
0
old_monty
def neighbors(cell,N):
Спасибо! Все заработало
Офлайн
16
Либо добавлять подходящие значения в новый список:
def neighbors(cell, N): lst = [(cell[0] + 1, cell[1]), (cell[0], cell[1] + 1), (cell[0], cell[1] - 1), (cell[0] + 1, cell[1] + 1), (cell[0] + 1, cell[1] - 1), (cell[0] - 1, cell[1]), (cell[0] - 1, cell[1] - 1), (cell[0] - 1, cell[1] + 1)] paths = [] for i in lst: if i[0] in range(N) and i[1] in range(N): paths.append(i) return paths
Отредактировано Stright (Янв. 8, 2017 20:49:53)
Офлайн
20
ProPallПожалуйста.
Спасибо! Все заработало
Офлайн