Loopar inuti loppar - Rader med siffror i ordningsföljd
Hej!
Jag försöker utför en uppgift som lyder såhär:
"Gör ett program som skriver ut siffrorna 1-9 i följd på en rad, och fem sådana rader under vartannat".
Den ska se ut på det här sättet:
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
Jag skrev såhär:
for i in range(1,10):
print(i, end='\t')
Jag lyckades med första raden, men vet inte hur jag ska fortsätta härifrån.
Tack i förhand!
Du kan t.ex lägga den loopen i en annan for-loop. Skriv ut en blank rad efteråt också.
Dr. G skrev:Du kan t.ex lägga den loopen i en annan for-loop. Skriv ut en blank rad efteråt också.
Finns det inte ett annat sätt än att upprepa samma for-loop fem gånger?
Jo, uppgiften kan lösas på många olika sätt.
En dubbel for-loop känns dock enklast.
Dr. G skrev:Jo, uppgiften kan lösas på många olika sätt.
En dubbel for-loop känns dock enklast.
Skulle du kunna visa hur man kan gör det på ett annat sätt med hjälp av for-loop eller while-loop?
Kanske genom att göra den kortare eller mindre upprepande.
En variant med bara en for-loop:
for i in range(9*5):
if (i % 9) == 0 and i != 0:
print('')
print('')
print(1+(i % 9), end='\t')
Vill man inte ha en for-loop inuti en for-loop?
Även om två for-loopar är det för mig uppenbart rätta sättet här så slänger jag ut en lösning som typ undviker for-loopar... men bara för att jag lägger in en så kallad "list comprehension" istället :)
>>> print('\n'.join(itertools.repeat(' '.join([str(x) for x in range(1, 10)]), 5)))
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
Ingen skulle lösa en sån där uppgift på det sättet dock. Rätt taskigt mot den stackars kollega eller pluggkompis som ska läsa denna hemska kodrad :)
Om du är nyfiken på varför det funkar så delar jag upp vad som händer.
[str(x) for x in range(1, 10)] <-- skapar en lista med siffrorna 1 till 10, representerade som text (strängar)
' '.join([str(x) for x in range(1, 10)]) <-- klistrar ihop (text-)siffrorna med ett mellanslag emellan varje, till en enda lång textsträng
itertools.repeat(' '.join([str(x) for x in range(1, 10)]), 5) <-- använder itertools-verktyget "repeat" för att upprepa samma sak fem gånger som en lista
'\n'.join(itertools.repeat(' '.join([str(x) for x in range(1, 10)]), 5)) <-- klistrar ihop de fem upprepade textsträngarna i listan med ett radbytestecken emellan varje, till en enda textsträng
print('\n'.join(itertools.repeat(' '.join([str(x) for x in range(1, 10)]), 5))) <-- skriver ut den resulterande textsträngen
Min variant:
print(5*(" ".join([str(x) for x in range(1,10)])+"\n"))
Min variant:
print(5*"1 2 3 4 5 6 7 8 9\n")
Har fördelarna att man inte behöver importera itertools, är lätt att förstå och är kort.