9 svar
302 visningar
Teletubbies.147 behöver inte mer hjälp
Teletubbies.147 57
Postad: 27 okt 2020 12:54

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!

Dr. G 9479
Postad: 27 okt 2020 13:56

Du kan t.ex lägga den loopen i en annan for-loop. Skriv ut en blank rad efteråt också. 

Teletubbies.147 57
Postad: 27 okt 2020 13:58 Redigerad: 27 okt 2020 13:59
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?

Dr. G 9479
Postad: 27 okt 2020 14:05

Jo, uppgiften kan lösas på många olika sätt. 

En dubbel for-loop känns dock enklast. 

Teletubbies.147 57
Postad: 27 okt 2020 14:10 Redigerad: 27 okt 2020 14:11
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.

Dr. G 9479
Postad: 27 okt 2020 14:43

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')

Laguna Online 30472
Postad: 27 okt 2020 16:48

Vill man inte ha en for-loop inuti en for-loop?

foppa 280 – Fd. Medlem
Postad: 27 okt 2020 20:40 Redigerad: 27 okt 2020 20:42

Ä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

Laguna Online 30472
Postad: 27 okt 2020 20:59

Min variant:

print(5*(" ".join([str(x) for x in range(1,10)])+"\n"))

Lindehaven 820 – Lärare
Postad: 30 okt 2020 08:47

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.

Svara
Close