admin 0Comment

To już trzecie zadanie praktyczne z kursu Automate the Boring Stuff with Python. Jeśli nie znasz kursu lub nie czytałeś tekstu wyjaśniającego pomysł na serię wpisów, powinieneś zrobić to tutaj.

Dzisiejsze zadanie, podobnie jak ostatnie, pochodzi z rozdziału czwartego i brzmi:

Character Picture Grid

Say you have a list of lists where each value in the inner lists is a one-character string, like this:

grid = [['.', '.', '.', '.', '.', '.'],

        ['.', 'O', 'O', '.', '.', '.'],

        ['O', 'O', 'O', 'O', '.', '.'],

        ['O', 'O', 'O', 'O', 'O', '.'],

        ['.', 'O', 'O', 'O', 'O', 'O'],

        ['O', 'O', 'O', 'O', 'O', '.'],

        ['O', 'O', 'O', 'O', '.', '.'],

        ['.', 'O', 'O', '.', '.', '.'],

        ['.', '.', '.', '.', '.', '.']]

You can think of grid[x][y] as being the character at the x- and y-coordinates of a “picture” drawn with text characters. The (0, 0) origin will be in the upper-left corner, the x-coordinates increase going right, and the y-coordinates increase going down.

Copy the previous grid value, and write code that uses it to print the image.

..OO.OO..

.OOOOOOO.

.OOOOOOO.

..OOOOO..

...OOO...

....O....

Hint: You will need to use a loop in a loop in order to print grid[0][0], then grid[1][0], then grid[2][0], and so on, up to grid[8][0]. This will finish the first row, so then print a newline. Then your program should print grid[0][1], then grid[1][1], then grid[2][1], and so on. The last thing your program will print is grid[8][5].

Also, remember to pass the end keyword argument to print() if you don’t want a newline printed automatically after each print() call.

Zwróć szczególną uwagę na podpowiedzi, zwłaszcza pierwsza bardzo pomaga w nakierowaniu na konkretne rozwiązanie. Musimy użyć pętli w pętli, co na początkowym etapie nauki nie jest takie łatwe. Druga podpowiedź przypomina o wykorzystaniu end do tego, by wyświetlanie danego łańcucha znaków nie kończyło się automatycznie przeskoczeniem do nowej linii:

print('One')

print('Two')

Wyświetli :

One

Two

Ale już:

print('One', end='')

print('Two')

Da nam:

OneTwo

W wypadku tego zadania (podobnie jak wielu innych) najlepszym rozwiązaniem jest opisanie sobie (lub komuś) tego, co mamy zamiar zrobić, aby ustalić czego mają dotyczyć kolejne pętle. Widzimy, że w pierwszej linijce powinniśmy po kolei wyświetlić pierwszy element z każdej kolejnej podlisty, potem przechodzimy do nowej linii, wyświetlamy drugi element z każdej kolejnej podlisty, i tak dalej, aż do ostatnich elementów każdej z podlist.

Zaczyna nabierać to sensu? Kolejnym ułatwieniem może być wypisanie po kolei indeksów kolejno wyświetlanych elementów list (co po części zostało zrobione w tekście zadania). Pierwsze dwie linie będą się składały z tych elementów:

grid[0][0] grid[1][0] grid [2][0] grid[3][0] (…) grid [8][0]

grid [0][1] grid[1][1] grid[2][1] grid[3][1] (…) grid[8][1]

(…)

Oznacza to, że dla wyświetleń w każdej linii rozwiązania NIE zmienia się liczba opisująca umieszczenie elementu w każdej z podlist. Warto też policzyć wyświetlenia – w każdej linii wyświetlimy dziewięć elementów (czyli tyle, ile jest podlist w głównej liście), a wyświetlonych w rozwiązaniu linii powinno być sześć (czyli tyle, ile jest elementów w każdej z podlist).

W tym momencie dobranie odpowiednich pętli powinno być już dużo łatwiejsze:

def prints_rotated(ourList):
    #Loops as many times as long is any list inside of the main one.
    for i in range(len(ourList[0])):
        #Loops as many times as long is the main list.
        for n in range(len(ourList)):
            print(ourList[n][i], end='')
        print()

Komentarze w kodzie raz jeszcze pomagają zrozumieć dlaczego stosuję taką a nie inną pętlę. Oczywiście druga funkcja print służy wyłącznie do przejścia do kolejnej linii i jej wcięcie w kodzie jest cofnięte, by przejście było wykonywane po każdej sekwencji iteracji przez osiem podlist wewnątrz głównej listy.

Jeśli rozwiązanie nie jest do końca jasne, polecam pogrzebać trochę w programie i zobaczyć jak zmieni się wynik. Oczywiście dla pełnego działania programu potrzebna jest główna lista oraz wywołanie funkcji:

grid = [['.', '.', '.', '.', '.', '.'],
        ['.', 'O', 'O', '.', '.', '.'],
        ['O', 'O', 'O', 'O', '.', '.'],
        ['O', 'O', 'O', 'O', 'O', '.'],
        ['.', 'O', 'O', 'O', 'O', 'O'],
        ['O', 'O', 'O', 'O', 'O', '.'],
        ['O', 'O', 'O', 'O', '.', '.'],
        ['.', 'O', 'O', '.', '.', '.'],
        ['.', '.', '.', '.', '.', '.']]

def prints_rotated(ourList):
    #Loops as many times as long is any list inside of the main one.
    for i in range(len(ourList[0])):
        #Loops as many times as long is the main list.
        for n in range(len(ourList)):
            print(ourList[n][i], end='')
        print()
        
prints_rotated(grid)

Dodaj komentarz