Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 24, 2016 18:48:08

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

Объясните, почему затираются значения в ходе выполнения программы?

В ходе решения задачи (https://py.checkio.org/mission/the-square-chest/) я написал вот этот код:

 def checkio(lines_list):
    square_list = []
    temp_lines_list = [0] * 4
    
    for line_1 in lines_list:
        temp_lines_list[0] = line_1
        
        for line_2 in lines_list:
            if line_2 in temp_lines_list[:1]:
                continue
            if (line_1[1] not in line_2) and (line_1[0] not in line_2):
                continue
            temp_lines_list[1] = line_2
            
            for line_3 in lines_list:
                if line_3 in temp_lines_list[:2]:
                    continue
                if (line_2[1] not in line_3) and (line_2[0] not in line_3):
                    continue
                temp_lines_list[2] = line_3
                    
                for line_4 in lines_list:
                    if line_4 in temp_lines_list[:3]:
                        continue
                    if (line_3[1] not in line_4) and (line_3[0] not in line_4):
                        continue
                    if (line_1[0] not in line_4) and (line_1[1] not in line_4):
                        continue
                    temp_lines_list[3] = line_4
                    #print(temp_lines_list)
                    temp_lines_list.sort()
                    #print(temp_lines_list)
                    #print(square_list)
                    #print(temp_lines_list in square_list)
                    if temp_lines_list not in square_list:
                        square_list.append(temp_lines_list)
                        
    print('square_list = ', square_list)
    return(len(square_list))
res = checkio([[1, 2], [3, 4], [1, 5], [2, 6], [4, 8], [5, 6], [6, 7],
                     [7, 8], [6, 10], [7, 11], [8, 12], [10, 11],
                     [10, 14], [12, 16], [14, 15], [15, 16]])
print(res)
Наблюдая за промежуточными значениями square_list я понимаю, что я правильно нахожу линии, соединяющие все 3 квадрата, но проблема в том, что при новые элементы никогда не добавляются в square_list.
При появлении новой комбинации она не добавляется, а как бы заменяет предыдущую.

Помогите, пожалуйста. Я действительно не могу понять в чем дело. Пробовал делать square_list в виде set, но он же путает элементы местами и из-за этого создается большее число комбинаций. Потом пробовал добавлять линии в square_list без проверок, но в конце получался список с большим числом абсолютно одинаковых линий.

Отредактировано Mr.Geekman (Дек. 25, 2016 11:35:26)

Офлайн

#2 Дек. 24, 2016 19:14:42

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Объясните, почему затираются значения в ходе выполнения программы?

У вас список temp_lines_list объявлен раньше цикла, поэтому нет никакого смысла добавлять его в другой список в цикле - вы каждый раз добавляете одно и то же. Объекты в питоне всегда присваиваются и передаются по ссылке.
Вот смотрите

 s = []
s1 = [0] * 5
s.append(s1)
s1[0] = "abc"
s.append(s1)
s1[1] = "AAA"
s.append(s1)
print(s)
Когда вы делаете s.append(s1) - вы помещаете в s указатель (ссылку) на s1, а не текущее значение.



Отредактировано FishHook (Дек. 24, 2016 19:16:20)

Офлайн

#3 Дек. 24, 2016 23:13:04

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

Объясните, почему затираются значения в ходе выполнения программы?

Подскажите, пожалуйста возможные варианты изменения кода для подобных случаев. Я вот например попробовал не создавать список с уже имеющимися в обращении связями, а непосредственно сравнивать новые связи с уже имеющимися.

     for line_1 in lines_list:
        
        for line_2 in lines_list:
            if line_2 == line_1:
                continue
            if (line_1[1] not in line_2) and (line_1[0] not in line_2):
                continue
            
            for line_3 in lines_list:
                if line_3 == line_2 or line_3 == line_1:
                    continue
                if (line_2[1] not in line_3) and (line_2[0] not in line_3):
                    continue
                    
                for line_4 in lines_list:
                    if line_4 == line_3 or line_4 == line_2 or line_4 == line_1:
                        continue
                    if (line_3[1] not in line_4) and (line_3[0] not in line_4):
                        continue
                    if (line_1[0] not in line_4) and (line_1[1] not in line_4):
                        continue
                    temp_lines_list = [line_1, line_2, line_3, line_4]
                    temp_lines_list.sort()
                    if temp_lines_list not in square_list:
                        square_list.append(temp_lines_list)
Не знаю, нормальное ли это решение?
Блин, да я к тому же ищу только квадраты 1*1, а надо уметь искать и более крупные квадраты. А вот это проблема, возможно стоит все переписать.

Отредактировано Mr.Geekman (Дек. 24, 2016 23:17:03)

Офлайн

#4 Дек. 25, 2016 07:12:03

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Объясните, почему затираются значения в ходе выполнения программы?

Mr.Geekman
Для начала дайте в нормальном виде задание, по вашей ссылке 404.



Офлайн

#5 Дек. 25, 2016 11:37:20

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

Объясните, почему затираются значения в ходе выполнения программы?

Странно, я дал правильную ссылку, но она ведет на 404. Чтобы попасть на страницу с заданием я попробовал просто скопировать ссылку в адресную строку.

Офлайн

#6 Дек. 25, 2016 12:42:36

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Объясните, почему затираются значения в ходе выполнения программы?

Да плевать куда она ведет, вы сюда в виде текста задание предоставьте. Не надо ссылок.



Офлайн

#7 Дек. 25, 2016 14:54:47

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9993
Репутация: +  857  -
Профиль   Отправить e-mail  

Объясните, почему затираются значения в ходе выполнения программы?

Mr.Geekman
Странно, я дал правильную ссылку, но она ведет на 404.
В адресную строку смотри, скобка прилипла
https://py.checkio.org/mission/the-square-chest/



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version