Найти - Пользователи
Полная версия: Объясните, почему затираются значения в ходе выполнения программы?
Начало » Python для новичков » Объясните, почему затираются значения в ходе выполнения программы?
1
Mr.Geekman
В ходе решения задачи (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 без проверок, но в конце получался список с большим числом абсолютно одинаковых линий.
FishHook
У вас список 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, а не текущее значение.
Mr.Geekman
Подскажите, пожалуйста возможные варианты изменения кода для подобных случаев. Я вот например попробовал не создавать список с уже имеющимися в обращении связями, а непосредственно сравнивать новые связи с уже имеющимися.
     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, а надо уметь искать и более крупные квадраты. А вот это проблема, возможно стоит все переписать.
FishHook
Mr.Geekman
Для начала дайте в нормальном виде задание, по вашей ссылке 404.
Mr.Geekman
Странно, я дал правильную ссылку, но она ведет на 404. Чтобы попасть на страницу с заданием я попробовал просто скопировать ссылку в адресную строку.
FishHook
Да плевать куда она ведет, вы сюда в виде текста задание предоставьте. Не надо ссылок.
py.user.next
Mr.Geekman
Странно, я дал правильную ссылку, но она ведет на 404.
В адресную строку смотри, скобка прилипла
https://py.checkio.org/mission/the-square-chest/
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