• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Formatowanie odstępów w liscie - python

Object Storage Arubacloud
0 głosów
1,488 wizyt
pytanie zadane 15 lipca 2019 w Python przez Ventre90 Obywatel (1,170 p.)
zamknięte 9 sierpnia 2019 przez Ventre90

Cześć drodzy pasjonaci.

Czy ktoś może podpowiedzieć jak prawidłowo sformatować poniższą dynamiczną tabliczkę mnożenia? chodzi o równe odstępy między wyrazami w kolumnach.

Problem polega na tym, że funkcja join na sztywno traktuje oddzielanie wyrazów ciągu, poprzez to gdy wyrazy zaczynają mieć więcej niż 1 znak, cala tabliczka zaczyna się ,, rozjeżdżać”.

Napisałem to w zwykłych pętlach, w tablicach ale efekt jest ten sam. Próbowałem, też dodać jakąś zmienną zawierająca formatowaną ilość znaków np.: {:4s}.format ( nazwa zmiennej) i potem // nazwa zmiennej.join(…) ale to nie przynosi żadnego efektu.

Jak ktoś ma chwile bardzo proszę o pomoc. Zamieszczam kody i output:

size = int(input("Provide table size: "))
tab = []

for i in range(1, size + 1):
    tab.append(i)

print("   "+"  ".join([str(tab[i]) for i in range(len(tab))]))

for i in range(len(tab)):
    multi = []
    for j in range(len(tab)):
        x = tab[i]*tab[j]
        x = str(x)
        multi.append(x)
    print(str(tab[i]) +"  "+"  ".join(multi))

Output:

   1  2  3  4  5
1  1  2  3  4  5
2  2  4  6  8  10
3  3  6  9  12  15
4  4  8  12  16  20
5  5  10  15  20  25

 

def main_table(n):
    board = []
    table = []
    for i in range(1,n+1):
        table.append(i)
        board.append(table)
        if i == n:
            print("    "+"   ".join([str(table[i]) for i in range(len(table))]))
            item = -1
            count = 0
            for row in board:
                item += 1
                count += 1
                multip_row =[]
                for j in range(1,n+1):
                    x = row[item]*j
                    multip_row.append([x])
                print(count, multip_row)
                
main_table(int(input("Table size: ")))

Output:

    1   2   3   4   5
1 [[1], [2], [3], [4], [5]]
2 [[2], [4], [6], [8], [10]]
3 [[3], [6], [9], [12], [15]]
4 [[4], [8], [12], [16], [20]]
5 [[5], [10], [15], [20], [25]]

komentarz zamknięcia: Temat rozwiazany

2 odpowiedzi

+1 głos
odpowiedź 15 lipca 2019 przez mokrowski Mędrzec (155,460 p.)
size = int(input("Provide table size: "))
tab = []

for i in range(1, size + 1):
    tab.append(i)

print((" " * 6) + " " + " ".join("{:>6d}".format(value) for value in tab))
print("-" * (7 * len(tab)) + "-" * 6)

for i in range(len(tab)):
    multi = []
    for j in range(len(tab)):
        x = tab[i]*tab[j]
        multi.append(x)
    result = ["{:>6d}".format(value) for value in multi]
    print("{:<6}|".format(tab[i]) + " ".join(result))

 

komentarz 18 lipca 2019 przez Ventre90 Obywatel (1,170 p.)

Cześć Mokrowski. Bardzo dziękuje za pomoc w tym temacie. Odpowiadam po kilku dniach gdyż poświęciłem trochę czasu aby przyswoić kompresje list. Robiłem głównie przykłady z dokumentacji i jeszcze jakieś swoje wymyślone. Starałem się rozpisać twoje kompresje aby lepiej zrozumieć co tam się dzieje. Niestety nie mogę dojść do tego dlaczego liczba spacji ciągle się różni od twojej. Rozpisane kompresje zamieściłem w komentarzach w kodzie.

Pytanie:

Co dokładnie znaczy zapis {:>6d}  i odwrotnie {:<6} ( ps wiem ze d to digit itd tylko chodzi mi o to czy to blokuje jakos znaki przeznaczone do wypisania zmiennej czy co ?

Dlaczego pierwszy rząd tabeli ( ten nad kreskami) w twoim kodzie zawsze ma równe 7 spacji pomiędzy wyrazami, a u mnie zapis daje 11 spacji ? Teoretycznie 1 spacja jest tu: :" "join() a 6 jest tu {:>6d}. Tylko u mnie ot tak nie działa.

size = int(input("Provide table size: "))
tab = []
 
for i in range(1, size + 1):
    tab.append(i)
 
print((" " * 6) + " " + " ".join("{:>6d}".format(value) for value in tab))
print("-" * (7 * len(tab)) + "-" * 6)
'''
s = ""
for value in tab:
	s +=" " + " ".join("{:>6d}".format(value))
print (" "*6,s)
'''

for i in range(len(tab)):
    multi = []
    for j in range(len(tab)):
        x = tab[i]*tab[j]
        multi.append(x)
    result = ["{:>6d}".format(value) for value in multi]
    print("{:<6}|".format(tab[i]) + " ".join(result))

'''
for i in range(len(tab)):
    multi = []
    for j in range(len(tab)):
        x = tab[i]*tab[j]
        multi.append(x)
        result=""
        for value in multi:
        	result +="{:>6d}".format((value))
    print("{:<6}|".format(tab[i]) + result)
'''

 w tym 2gim komentarzu tez mam cos nie tak. Jak tam w ostatniej linii ... + " ".join(result) to sie robi jakiś chory rozjazd. A tak:

Output ( to jest puszczone po usunięciu 2-ch nawiasów od komentarza od 1 idzie ta moje rozpiska)

komentarz 18 lipca 2019 przez mokrowski Mędrzec (155,460 p.)

Hmm... masz tu trochę pytań.. może zacznijmy od tego byś zapoznał się z:

https://docs.python.org/3/library/string.html#formatspec

Nie do końca rozumiem problem... Mój kod daje następujący wynik:

Provide table size: 5
            1      2      3      4      5
-----------------------------------------
1     |     1      2      3      4      5
2     |     2      4      6      8     10
3     |     3      6      9     12     15
4     |     4      8     12     16     20
5     |     5     10     15     20     25

Masz inny wynik na konsoli (wnoszę z czcionki) cmd MS Windows? O to chodzi?

 

komentarz 19 lipca 2019 przez Ventre90 Obywatel (1,170 p.)

Dobra to teraz bardzo zwięźle o co pytam:

1.Dałem sobie zadanie aby przekształcić twoje kompresje list na kod bez kompresji, tak aby output był taki sam.

Pytanie: Jak dokładnie działa funkcja join() w twoich kompresjach listy/pętli.

Teraz zamieszczę kod i output aby zwizualizować pytanie (twój i mój kod opisany w komentarzach):

#mokrowski
size = int(input("Provide table size: "))
tab = []
 
for i in range(1, size + 1):
    tab.append(i)
 
print((" " * 6) + " " + " ".join("{:>6d}".format(value) for value in tab))
print("-" * (7 * len(tab)) + "-" * 6)
 
for i in range(len(tab)):
    multi = []
    for j in range(len(tab)):
        x = tab[i]*tab[j]
        multi.append(x)
    result = ["{:>6d}".format(value) for value in multi]
    print("{:<6}|".format(tab[i]) + " ".join(result))

print("\n"*2)

#Ventre90
#size = int(input("Provide table size: "))
tab = []
for i in range (1,size+1):
    tab.append(i)

top_row = ""
for value in tab:
    top_row += "{:>6d}".format(value)
print (" "*7 + top_row)
print("-" * (6*len(tab)) + "-" * 7)

for i in range(len(tab)):
    multi = []
    for j in range(len(tab)):
        x = tab[i] * tab[j]
        multi.append(x)
    result = ""
    for value in multi:
        result += "{:>6d}".format(value) 
    print("{:<6d}|".format(tab[i]) + " ".join(result))

Teoretycznie brakuje mi 1 spacji miedzy wyrazami w kolumnie. Każdy wyraz w zmiennej result ma zarezerwowane 6 znaków. W moim rozumieniu ( jak widac błędnym) przerabiając ostatnią linie na:

print("{:<6d}|".format(tab[i]) + " ".join(result))

nie daje to efektu 1 dodatkowej spacji miedzy wyrazami i totalnie nie rozumiem skąd bierze sie ten rozjazd:

PS. Już o tym formatowaniu od lewej, prawej czy center to sobie poczytałam to już wiem o co chodzi. Wiem, ze mogę rozwiązać ten problem rezerwując 1 znak więcej w środku wyrazów dla zmiennej "result" - ale to nie zmienia że nie wiem dlaczego join() działa jak działa. A no i wiem ze nie zmieniam 1 wiersza tabelko ale to tylko testy. Join w tamtym miejscu daje dokładnie ten sam efekt.

+1 głos
odpowiedź 15 lipca 2019 przez Benek Szeryf (90,870 p.)
n = 40

for row in range(1, n + 1):
    print(*("{:>{m}}".format(row*col, m=len(str(n**2))) for col in range(1, n + 1)))

 

komentarz 18 lipca 2019 przez Ventre90 Obywatel (1,170 p.)

@Benek dziekuje za Twoją odpowiedź. Twój skill jednak przerasta moje możliwości pojmowania, wiec nawet nie brałem się za rozpisywanie tej kompresji. Możesz to rozpisać pętla po pętli ?

komentarz 18 lipca 2019 przez Benek Szeryf (90,870 p.)

Weźmy 4. linię. Znajdziesz w niej generator, który jest objęty w okrągłe nawiasy. To jest na przykład generator:

(i for i in range(5))

Możesz go użyć wraz z pętlą, by iterować po jego kolejnych elementach. Innymi słowy możesz zrobić coś takiego:

for j in (i for i in range(5)):
    print(j)

Ostatnia pętla wypisze cyfry od 0 do 4, umieszczając każdą w nowej linii. Możesz też wydrukować wartości z generatora z pomocą operatora gwiazdki:

print(*(i for i in range(5)))

Co da Ci ciąg: 0 1 2 3 4. Mniej więcej właśnie to się dzieje w 4. linii. Dochodzi tam jeszcze metoda .format, która przyjmuje 2 argumenty. Pierwszym jest iloczyn dwóch liczb: row*col, drugim jest m=len(str(n**2)) co zwraca Ci liczbę cyfr, która tworzy największą liczbę w tabliczce mnożenia. Na przykład dla tabliczki o rozmiarze 20 x 20, największą liczbą jest 4000, a więc każda z liczb powinna zając 4 cyfry. Znak > mówi nam o tym, by wyrównać liczbę do prawej. Przecież zdarzy się tak, że w tabliczce 20 x 20 mamy też liczby 1-, 2-, 3-cyfrowe. Przesunięcie ich w prawo pozwala wyrównać kolumny.

komentarz 19 lipca 2019 przez Ventre90 Obywatel (1,170 p.)
Benek bardzo dziękuje za zaangażowanie. Na pewno rozjaśniłeś temat. Będe sie starał coś z tym robić praktycznego, żeby to przyswoić.

Podobne pytania

0 głosów
1 odpowiedź 165 wizyt
pytanie zadane 11 września 2016 w Python przez Nightmare43 Użytkownik (630 p.)
0 głosów
1 odpowiedź 73 wizyt
0 głosów
2 odpowiedzi 97 wizyt
pytanie zadane 24 stycznia w HTML i CSS przez whiteman808 Obywatel (1,820 p.)

92,551 zapytań

141,393 odpowiedzi

319,523 komentarzy

61,936 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...