Problem z dodawaniem kolejnych elementów do tablicy oraz jej rozszerzaniem funkcją .append

0

Dzień dobry.

Cały kod jest długi, dlatego wklejam tylko wycinek. Macierz wierzchołków jest to macierz, która jeżeli wierzchołek jest połączony z innym przypisuje na skrzyżowaniu losową wartość z przedziału, mówiącą o maksymalnej przepustowości tego połączenia. Dodaje element do tablicy tras jeżeli znajdzie połączenie pomiędzy wierzchołkami. Tablica tras ma finalnie wypisać wszystkie możliwe trasy pomiędzy wierzchołkami w grafie spójnym nieskierowany. Stan, który jest pokazany poniżej pokazuje, że znalazł na wierzchołka nr 4 połączenia z nr 0 i nr 3. Teraz chciałbym, żeby poszukał połączeń dla wierzchołków 0 i 3 oraz zapisywał to to tablicy tras jak poniżej. Tu akurat sytuacja tylko dla wierzchołka nr 0, ponieważ nie potrafię jeszcze tego iterować.
Kod dobrze wyszukuje, z którymi się łączy, ale źle zapisuje wyniki do tablicy tras, jak poniżej.

print(tablica_tras) 

iteracja_tras=0
iteracja_macierz=0
iteracja_while=0
nr_wierzcholka_sprawdzanego_w_tabblicy_tras=1

while iteracja_while < liczba_wierzcholkow:
   if (macierz_wierzcholkow[tablica_tras[iteracja_tras][nr_wierzcholka_sprawdzanego_w_tabblicy_tras],iteracja_macierz] > 0):
       tablica_tras.append(tablica_tras[iteracja_tras])
       tablica_tras[len(tablica_tras)-1].append(iteracja_macierz)
       iteracja_while = iteracja_while + 1
       iteracja_macierz = iteracja_macierz + 1
   else:
       iteracja_while = iteracja_while + 1
       iteracja_macierz = iteracja_macierz + 1

print(tablica_tras)

w wyniku działania kodu j.w. dostaję

[[4, 0], [4, 3]] -> to jest pierwotna tablica tras

[[4, 0, 1, 2, 4], [4, 3], [4, 0, 1, 2, 4], [4, 0, 1, 2, 4], [4, 0, 1, 2, 4]] -> to jest tablica wynikowa

nie rozumiem dlaczego modyfikuje np. element tablica_tras[0] i dlaczego nie wygląda to tak jak bym chciał, żeby po prostu skopiowało tablica_tras[0] x 3, wstawiło na koniec tablicy oraz dodało do każdego wierzchołek, z którym się łączy. Ja sobie to wyobrażałem tak jak poniżej.

[[4, 0], [4, 3], [4, 0, 1], [4, 0, 2], [4, 0, 4]]

Poniżej skrócony problem, możliwy do uruchomienia, ale tożsamy z moim problemem:

tablica_tras=[[4, 0], [4, 3]]
print(tablica_tras) 

iteracja_tras=0
iteracja_macierz=0
iteracja_while=0
nr_wierzcholka_sprawdzanego_w_tabblicy_tras=1


while iteracja_while < 3:
        tablica_tras.append(tablica_tras[iteracja_tras])
        tablica_tras[len(tablica_tras)-1].append(iteracja_macierz)
        iteracja_while = iteracja_while + 1
        iteracja_macierz = iteracja_macierz + 1

print(tablica_tras)

ponieważ wynik tego, że modyfikuje wszystkie elementy tablicy

[[4, 0], [4, 3]]
[[4, 0, 0, 1, 2], [4, 3], [4, 0, 0, 1, 2], [4, 0, 0, 1, 2], [4, 0, 0, 1, 2]]

Męczę się z tym od dłuższego czasu, czy ktoś mógłby mi pokazać gdzie popełniam błąd? Z góry dziękuję.

1
tablica_tras=[[4, 0], [4, 3]]
print(tablica_tras) 
 
iteracja_tras=0
iteracja_macierz=0
iteracja_while=0
nr_wierzcholka_sprawdzanego_w_tabblicy_tras=1
 
while iteracja_while < 3: #Pierwszy przelot pętli
----------------------
        tablica_tras.append(tablica_tras[iteracja_tras]) #dodajesz do tablicy_tras kolejny element będący już w niej pod indeksem 0. czyli tablica_tras[[4,0], [4,3], [4,0]]
        tablica_tras[len(tablica_tras)-1].append(iteracja_macierz) #dodajesz do ostatniego elementu [4,0] będącego równocześnie pierwszym elementem(referencja) iteracje macierz, czyli przybiera postać [4, 0, 0]
        iteracja_while = iteracja_while + 1 #Zwiększasz iteracje_while, teraz jest równa 1
        iteracja_macierz = iteracja_macierz + 1 #zwiększasz iteracje macierz, teraz jest równa 1
---------------------- #Drugi przelot pętli
        tablica_tras.append(tablica_tras[iteracja_tras]) #dodajesz do tablicy_tras kolejny element będący już w niej pod indeksem 0. czyli tablica_tras[[4,0,0], [4,3], [4,0,0], [4,0,0]]
        tablica_tras[len(tablica_tras)-1].append(iteracja_macierz) #dodajesz do ostatniego, przedostatniego i pierwszego elementu [4,0,0] wartość z iteracja_macierz, czyli przybiera postać [4, 0, 0, 1] 
#Daje nam to znów [[4, 0, 0, 1], [4, 3], [4, 0, 0, 1], [4, 0, 0, 1]
        iteracja_while = iteracja_while + 1 #Zwiększasz iteracje_while, teraz jest równa 1
        iteracja_macierz = iteracja_macierz + 1 #zwiększasz iteracje macierz, teraz jest równa 1
---------------------- # Itd. aż zakończy się pętla while.
print(tablica_tras)

Problemem jest tu wiele rzeczy.
Pierwsze to że działasz na zmiennych globalnych.
Drugie, że nie widzę tu twojej losowości.
Trzecie - debug programu ci potrzebny. Albo bawisz się z printami w pętlach co krok i analizujesz. Albo korzystasz z narzędzi - obie praktyki przydatne w szczególnych problemach.
Wygodniejsze i lepsze dla większości krótkich funkcji to
http://pythontutor.com/visualize.html#code=tablica_tras%3D%5B%5B4,%200%5D,%20%5B4,%203%5D%5D%0Aprint%28tablica_tras%29%20%0A%20%0Aiteracja_tras%3D0%0Aiteracja_macierz%3D0%0Aiteracja_while%3D0%0Anr_wierzcholka_sprawdzanego_w_tabblicy_tras%3D1%0A%20%0Awhile%20iteracja_while%20%3C%203%3A%0A%20%20%20%20%20%20%20%20tablica_tras.append%28tablica_tras%5Biteracja_tras%5D%29%0A%20%20%20%20%20%20%20%20tablica_tras%5Blen%28tablica_tras%29-1%5D.append%28iteracja_macierz%29%0A%20%20%20%20%20%20%20%20iteracja_while%20%3D%20iteracja_while%20%2B%201%0A%20%20%20%20%20%20%20%20iteracja_macierz%20%3D%20iteracja_macierz%20%2B%201%0A%20%0Aprint%28tablica_tras%29&cumulative=false&heapPrimitives=false&mode=edit&origin=opt-frontend.js&py=3&rawInputLstJSON=%5B%5D&textReferences=false

To ci przedstawi krok po kroku co się dzieje w twoim programie.
Natomiast chyba rozumiem już co chcesz osiągnąć. Jako argument podajesz dwa wierzchołki macierzy i chcesz dodać pozostałe w formie dwie wartości wychodzące i wartości do których prowadzi druga wartość nie będące tą w drugim argumencie.
Rozwiązać to można prościej:

data = [[4,0], [4,3]]
wierzcholki = 5 # 0, 1, 2, 3, 4 => Łącznie to 5 wierzchołków, 
#Jeśli źle rozumiem i 5 również powinno być zawarte w for podmień wierzcholki na wierzcholki+1
for val in range(data[0][1], wierzcholki):
    data.append(data[0]+[val]) if val != data[1][1] and val != data[0][1] else None
print(data)

Polecam sprawdzić jak działa kod który podesłałem powyżej, w linku który zawiera twoją "metodę".

0

Poniżej jest to co napisałem do tej pory. Dziękuję za uwagi. Twoje rozwiązanie tworzy tą tablicę w pożądany przeze mnie sposób. Tylko u mnie problemem jest to, że on startuje od pierwszego wierzchołka i szuka wierzchołków z nim połączonych. Potem od tych co znalazł szuka kolejnych, żeby finalnie stworzyć tablicę wszystkich dostępnych tras pomiędzy początkiem i końcem. Nie pisałem nigdy wcześniej w Pythonie stąd te moje złe praktyki. Uczę się go na bieżąco podczas pisania i staram się dużo czytać. Problemem w tych trasach jest to, że on musi sprawdzać czy przypadkiem się nie cofa do wierzchołka, w którym już był. Jest tutaj mnóstwo rzeczy do ogarnięcia.

import numpy as np
import random

liczba_wierzcholkow=5
liczba_dodanych_polaczen_wierzcholkow = round((liczba_wierzcholkow*0.4),0)
print('liczba dodanych=', liczba_dodanych_polaczen_wierzcholkow)
iteracja = 0
poprzedni_wierzcholek_ptw = 0
kolejny_wierzcholek_ptw = 1
macierz_wierzcholkow = np.zeros((liczba_wierzcholkow,liczba_wierzcholkow))
tablica_wierzcholkow = np.arange(liczba_wierzcholkow)

np.random.shuffle(tablica_wierzcholkow)
print(tablica_wierzcholkow)

while iteracja<(liczba_wierzcholkow-1):
    pierwsza_wspolrzedna_mw  = (tablica_wierzcholkow[poprzedni_wierzcholek_ptw])
    druga_wspolrzedna_mw = (tablica_wierzcholkow[kolejny_wierzcholek_ptw])
    macierz_wierzcholkow[pierwsza_wspolrzedna_mw,druga_wspolrzedna_mw]=random.randint(50,100)
    print('przypisuje do pustego wierzcholka (', pierwsza_wspolrzedna_mw, druga_wspolrzedna_mw, ') wartosc=', macierz_wierzcholkow[pierwsza_wspolrzedna_mw,druga_wspolrzedna_mw])
    macierz_wierzcholkow[druga_wspolrzedna_mw,pierwsza_wspolrzedna_mw]=macierz_wierzcholkow[pierwsza_wspolrzedna_mw,druga_wspolrzedna_mw]
    iteracja = iteracja + 1
    poprzedni_wierzcholek_ptw = poprzedni_wierzcholek_ptw + 1
    kolejny_wierzcholek_ptw = kolejny_wierzcholek_ptw + 1
    
print(macierz_wierzcholkow)
    
iteracja=0
while iteracja<=liczba_dodanych_polaczen_wierzcholkow:
    pierwszy_losowy_wierzcholek=random.choice(tablica_wierzcholkow)
    drugi_losowy_wierzcholek=random.choice(tablica_wierzcholkow)
    print('(',pierwszy_losowy_wierzcholek,drugi_losowy_wierzcholek,')')
    print(macierz_wierzcholkow[pierwszy_losowy_wierzcholek,drugi_losowy_wierzcholek]) 
    if (macierz_wierzcholkow[pierwszy_losowy_wierzcholek,drugi_losowy_wierzcholek])==0 and pierwszy_losowy_wierzcholek != drugi_losowy_wierzcholek:
        macierz_wierzcholkow[pierwszy_losowy_wierzcholek,drugi_losowy_wierzcholek]=random.randint(50,100)
        macierz_wierzcholkow[drugi_losowy_wierzcholek,pierwszy_losowy_wierzcholek]=macierz_wierzcholkow[pierwszy_losowy_wierzcholek,drugi_losowy_wierzcholek]
        iteracja=iteracja + 1
        print('jest wolny i nie laczy sie sam ze soba, przypisuje do pustego wierzcholka wartosc =', macierz_wierzcholkow[pierwszy_losowy_wierzcholek,drugi_losowy_wierzcholek]) 
    else:
        print('byl juz zajety lub wymaga polaczenia semego ze soba')
        
print()
print(macierz_wierzcholkow)

iteracja=0
while iteracja<liczba_wierzcholkow:
    tablica_wierzcholkow[iteracja]=random.randint(50,100)
    iteracja = iteracja + 1

iteracja_for=0
poczatek=4
koniec=0
tablica_tras = [[poczatek for col in range(1)] for row in range(1)]
kolejny_element_tablicy_tras=0

print()
print(tablica_tras)

for iteracja_for in range(liczba_wierzcholkow):
    if (kolejny_element_tablicy_tras==0) and (macierz_wierzcholkow[poczatek,iteracja_for]) > 0:
        tablica_tras[kolejny_element_tablicy_tras].append(iteracja_for)
        print('jestem if, a iteracja=', iteracja_for)
        iteracja_for = iteracja_for + 1
        kolejny_element_tablicy_tras = kolejny_element_tablicy_tras + 1
        print()
        print(tablica_tras)
        print()

    elif (iteracja_for > 0) and (macierz_wierzcholkow[poczatek,iteracja_for]) > 0:
        tablica_tras.append([poczatek])
        tablica_tras[kolejny_element_tablicy_tras].append(iteracja_for)
        print('jestem elif, a iteracja=', iteracja_for)
        iteracja_for = iteracja_for + 1
        kolejny_element_tablicy_tras = kolejny_element_tablicy_tras + 1
        print()
        print(tablica_tras)
        print()

    else:
        print('jestem else, a iteracja=', iteracja_for)
        iteracja_for = iteracja_for + 1
    
    iteracja_for=0
    
print()
print(tablica_tras) 

iteracja_tras=0
iteracja_macierz=0
iteracja_while=0
nr_wierzcholka_sprawdzanego_w_tabblicy_tras=1
 
while iteracja_while < liczba_wierzcholkow:
    if (macierz_wierzcholkow[tablica_tras[iteracja_tras][nr_wierzcholka_sprawdzanego_w_tabblicy_tras],iteracja_macierz] > 0):
        tablica_tras.append(tablica_tras[iteracja_tras])
        tablica_tras[len(tablica_tras)-1].append(iteracja_macierz)
        iteracja_while = iteracja_while + 1
        iteracja_macierz = iteracja_macierz + 1
    else:
        iteracja_while = iteracja_while + 1
        iteracja_macierz = iteracja_macierz + 1
 
print(tablica_tras)
1

A nie jest tak, że po prostu wstawiasz tablicę (czyli referencję) zamiast ją kopiować?
Dziwne zachowanie podczas inicjalizacji tablic wielowymiarowych

1 użytkowników online, w tym zalogowanych: 0, gości: 1