Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 8, 2017 16:34:05

ProPall
Зарегистрирован: 2016-10-10
Сообщения: 28
Репутация: +  0  -
Профиль   Отправить e-mail  

Убрать минусовые значения из списка кортежей.

Есть функция 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
Каким образом можно это сделать?

Офлайн

#2 Янв. 8, 2017 18:25:24

old_monty
Зарегистрирован: 2015-09-27
Сообщения: 238
Репутация: +  20  -
Профиль   Отправить e-mail  

Убрать минусовые значения из списка кортежей.

Воспользуйтесь функцией 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)

Офлайн

#3 Янв. 8, 2017 18:47:36

ProPall
Зарегистрирован: 2016-10-10
Сообщения: 28
Репутация: +  0  -
Профиль   Отправить e-mail  

Убрать минусовые значения из списка кортежей.

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)

Отредактировано ProPall (Янв. 8, 2017 18:48:12)

Офлайн

#4 Янв. 8, 2017 19:13:53

old_monty
Зарегистрирован: 2015-09-27
Сообщения: 238
Репутация: +  20  -
Профиль   Отправить e-mail  

Убрать минусовые значения из списка кортежей.

ProPall
Проверил, все равно выводит значения которые не могут быть
Если cell - (0,0)
Выводит - (1, 0), (0, 1), (1, 1), (-1, 0), (-1, 1)
Это же еще зависит от значения N. А в проверке условия с any() вроде нет ошибки.
Или может, надо строгие неравенства (< и >) заменить на нестрогие (<= и >= ).

Отредактировано old_monty (Янв. 8, 2017 19:22:49)

Офлайн

#5 Янв. 8, 2017 20:03:11

ProPall
Зарегистрирован: 2016-10-10
Сообщения: 28
Репутация: +  0  -
Профиль   Отправить e-mail  

Убрать минусовые значения из списка кортежей.

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

Офлайн

#6 Янв. 8, 2017 20:33:51

old_monty
Зарегистрирован: 2015-09-27
Сообщения: 238
Репутация: +  20  -
Профиль   Отправить e-mail  

Убрать минусовые значения из списка кортежей.

Нашел я в чем тут ошибка. Удаление элемента из списка изменяет этот список, и на каждом шаге 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)

Офлайн

#7 Янв. 8, 2017 20:44:38

Romissevd
От: Счастье
Зарегистрирован: 2015-03-01
Сообщения: 533
Репутация: +  76  -
Профиль   Отправить e-mail  

Убрать минусовые значения из списка кортежей.

Чтобы работал Ваш код можно сделать полную копию списка, чтобы при вызове 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

Офлайн

#8 Янв. 8, 2017 20:45:49

ProPall
Зарегистрирован: 2016-10-10
Сообщения: 28
Репутация: +  0  -
Профиль   Отправить e-mail  

Убрать минусовые значения из списка кортежей.

old_monty
def neighbors(cell,N):
Спасибо! Все заработало

Офлайн

#9 Янв. 8, 2017 20:48:13

Stright
От: Кострома
Зарегистрирован: 2015-01-20
Сообщения: 139
Репутация: +  16  -
Профиль   Отправить e-mail  

Убрать минусовые значения из списка кортежей.

Либо добавлять подходящие значения в новый список:

 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)

Офлайн

#10 Янв. 8, 2017 21:45:06

old_monty
Зарегистрирован: 2015-09-27
Сообщения: 238
Репутация: +  20  -
Профиль   Отправить e-mail  

Убрать минусовые значения из списка кортежей.

ProPall
Спасибо! Все заработало
Пожалуйста.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version