Найти - Пользователи
Полная версия: Убрать минусовые значения из списка кортежей.
Начало » Python для новичков » Убрать минусовые значения из списка кортежей.
1 2
ProPall
Есть функция 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
Каким образом можно это сделать?
old_monty
Воспользуйтесь функцией any()
 for i in paths:
        if any((i[0] < 0, i[0] > N-1, i[1] < 0,  i[1] > N-1)):
            paths.remove(i)
ProPall
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
Если cell - (0,0)
Выводит - (1, 0), (0, 1), (1, 1), (-1, 0), (-1, 1)
Должно - (1, 0), (0, 1), (1, 1)
old_monty
ProPall
Проверил, все равно выводит значения которые не могут быть
Если cell - (0,0)
Выводит - (1, 0), (0, 1), (1, 1), (-1, 0), (-1, 1)
Это же еще зависит от значения N. А в проверке условия с any() вроде нет ошибки.
Или может, надо строгие неравенства (< и >) заменить на нестрогие (<= и >= ).
ProPall
old_monty
N = 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
old_monty
Нашел я в чем тут ошибка. Удаление элемента из списка изменяет этот список, и на каждом шаге 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()
Romissevd
Чтобы работал Ваш код можно сделать полную копию списка, чтобы при вызове 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
ProPall
old_monty
def neighbors(cell,N):
Спасибо! Все заработало
Stright
Либо добавлять подходящие значения в новый список:
 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
old_monty
ProPall
Спасибо! Все заработало
Пожалуйста.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB