39 svar
287 visningar
whsa1002 är nöjd med hjälpen
whsa1002 21
Postad: 6 mar 19:59

Ta bort varannat element i en lista, med en for-loop.

Hej!

Sitter fast med följade problem, har kommit en bit på vägen och jag tror att det är rätt. Men vad som ska stå efter "for k in range (vlen):" är oklart! Ska tilläggas att inga if-satser eller while loopar får användas. Uppgiften lyder såhär: 

"I denna uppgift skall du skriva en for-loop för att, utifrån en given vektor med jämnt antal element, skapa en ny vektor genom att ta bort vartannat element. Om t.ex. v=[3,5,2,7,0,4,8,1] så skall den nya vektorn bli u=[3,2,0,8]

När du testar din kod i Python ska alltså print(u) visa [3. 2. 0. 8.] för exemplet ovan.

 

Programmet inleds med att läsa in en datafil i en vektor och avslutas med att skriva ut resultatet. Din uppgift är att, i rutan nedan, fylla i de kommandon däremellan som ger önskat resultat (delar av koden är förifylld som hjälp på traven, ändra inte dessa rader). Programmet får inte använda en if-sats eller while-loop för att lösa problemet. 

 

Regler du måste följa:

- De första raderna ( import numpy as np och  v=np.genfromtxt('data.txt')  ), samt den sista ( print('Den nya vektorn är [' + str(u) + ']') ) är redan ifyllda och kan inte ändras (och inte upprepas i kodrutan).

- Indentera inte raderna mer än nödvändigt (och tillåtet).

- Variablerna är skiftlägeskänsliga, så använd inte stor bokstav när det ska vara liten (eller tvärtom).

- Vektorn som läses in heter v och vektorn som skrivs ut heter u."

 

Jag har kommit såhär långt, har testat lite olika på vad som ska vara efter "for k in range (vlen)" i python men kommer inte framåt... : 

Import numpy as np

v = np.array[3,5,2,7,0,4,8,1]

vlen = np.size(v)
u = np.zeros(2*vlen)

for k in range(vlen):
     u[k] = ...
        ...
print('Den nya vektorn är['+str(u)+']')
CurtJ 1159
Postad: 6 mar 20:58

Läs på om funktionen på range. Där kan du stega varannat element och det borde lösa ditt problem .

Testa o återkom. 

Laguna Online 28709
Postad: 6 mar 21:10

Om vlen är 8 så ska längden på u vara 4. Du ska alltså dela med 2, inte multiplicera.

whsa1002 21
Postad: 6 mar 21:22

hmm, ja det förklarar varför resultatet aldrig hade längden 4 vilket jag var ute efter. Men förstår inte HUR jag säger åt programmet att varannat element ska bort, vilket jag antar är vad som görs i for-satsen?

whsa1002 21
Postad: 6 mar 21:45

Dock föreslog min lärare att det skulle vara just 2*vlen då vi vill göra en lista som är dubbelt så lång med endast 0:or och sedan sätta in värden med index ex. 2j från v in i u där index är j

Laguna Online 28709
Postad: 6 mar 21:54

Om man ska loopa över index finns det två sätt att göra det:

1) Man loopar över indexen för elementen i u och stoppar in rätt element från v i u för varje index. Alltså man tittar på varje plats i u och frågar "vad ska ligga här".

2) Man loopar över indexen för elementen i v (och hoppar på ett eller annat sätt över vartannat) och stoppar in i u de element som ska vara med i u. Alltså man tittar på varje element i v och frågar "var ska jag lägga det här elementet i u (om det ska vara där alls)".

Varför läraren föreslår 2*vlen förstår jag inte.

whsa1002 21
Postad: 6 mar 22:04

Ja okej. Det blir så förvirrande dethär, detta är första programmeringskursen jag läser någonsin, läser tekniskt basår. Vet att många haft problem med denna uppgift...Det som är svårt är precis det du skriver i 2), hur säger jag detta till datorn? Står inget om detta i våra anvisningar vi fått och läraren går i stort sett bara igenom dessa live varannan vecka, sen får vi klara oss själva...

Laguna Online 28709
Postad: 6 mar 22:22

Jag föreslår metod 1. Den känns enklare.

Det du vill åstadkomma, fast med en for-loop, är:

u[0] = v[0]
u[1] = v[2]
u[2] = v[4]
u[3] = v[6]

Är du med på det?

whsa1002 21
Postad: 6 mar 22:25

Ja, detta är jag med på!

Laguna Online 28709
Postad: 6 mar 22:50

Kan du göra en loop med range då, som gör just detta?

whsa1002 21
Postad: 6 mar 23:12

Jag kan tänka mig hur det skulle kunna se ut, men får inte ner det i kod. Det jag skriver in fungerar iallafall inte...tänker mig kanske att man iallafall anger:

for k in range(vlen):

och härifrån skriver loopen, men hur vet jag inte.

Laguna Online 28709
Postad: 6 mar 23:48

Om man ska göra om precis min lista av tilldelningar blir det

for i in range(4):

    u[i] = v[2*i]

Återstår bara att skriva den där 4 mer generellt.

whsa1002 21
Postad: 7 mar 07:31 Redigerad: 7 mar 07:44

Om vi vill skriva det där 4 står mer generellt, ska vi då ange typ i vilket intervall vi vill stoppa in i? Men samtidigt säga att det ska vara 4 element?

Skriver jag in detta i python får jag detta resultat, vilket är vad jag vill ha! Men bara hälften av intervallet med de första 4 elementen, inte några 0or

Import numpy as np
v=np.array([3,5,2,7,0,4,8,1])

vlen=np.size(v)
u=np.zeros(vlen)/2

for k in range(4):
     u[k]=v[2*k]

print('Den nya vektorn är['+str(u)+']')



Den nya vektorn är [3. 2. 0. 8. 0. 0. 0. 0.]
Laguna Online 28709
Postad: 7 mar 07:47

Nånting skoj verkar hända med vektorn när man delar den med två.

Det jag menade var att dela vlen med två.

whsa1002 21
Postad: 7 mar 07:50

Du menar den efter np.zeros då? För när jag tar bort delat med två här, blir det ingen skillnad från när jag bara skriver vlen, får samma resultat. Testade att lägga den såhär: (vlen)/2 vilket gav resultatet ovan, men (vlen/2) gav error

Laguna Online 28709
Postad: 7 mar 07:52

Du kommer antagligen vidare om du försöker tolka felmeddelandet. Hur lyder det?

whsa1002 21
Postad: 7 mar 07:58

Nu fick du en float. Eftersom längden på v alltid ska vara jämnt så går det bra att du direkt omvandlar det till en int med int(vlen/2).

Laguna Online 28709
Postad: 7 mar 08:39

Eller använder operatorn //.

I Python 2 gav / en int i det här läget.

whsa1002 21
Postad: 7 mar 08:43

Nu så!! Tror detta ska vara rätt, frågan tillhör en möbius dugga vi ska utföra varje vecka där vi får ta hjälp av klasskompisar lärare etc. Återkommer om möbius inte godkänner detta. Tack för hjälpen, tror jag förstår bättre nu hur loppen fungerar!

whsa1002 21
Postad: 7 mar 08:50


whsa1002 21
Postad: 7 mar 08:50

Möbius godkände inte mitt svar….

Svaret kan bli fel pga dubbla parenteser. Det ser ut som de inte vill att u ska vara en vektor när den printas utan en string.

Eller så är det nog att du inte generaliserat rangen. Nu funkar det bara om storleken på v är 8.

Kan du komma på något sätt att lösa detta?

whsa1002 21
Postad: 7 mar 08:56

Ja, alltså det är ju just det. Min lärare vill att de två första raderna ska vara:

vlen = np.size(v)

u=np.zeros(2*vlen)

Sedan svarade han såhär:

"De två första raderna skapar en vektor (=fält) u som är dubbelt så lång som vektorn v och som innehåller enbart nollor. Det man ska göra i loopen sedan är att man på de platser med jämnt index i u ska man placera elementen som finns i v. Alltså elementet med index 2*j i u ska vara lika med elementet med index j i v. Loopen ska alltså köras lika många varv som v är lång och det man man uppnå med att t.ex. använda np.arange (alternativt range som finns inbyggt i Python)."

whsa1002 21
Postad: 7 mar 08:56

Jag tänkte att (vlen) skulle vara i rangen då det blir generaliserat

Laguna Online 28709
Postad: 7 mar 08:59
whsa1002 skrev:

Ja, alltså det är ju just det. Min lärare vill att de två första raderna ska vara:

vlen = np.size(v)

u=np.zeros(2*vlen)

Sedan svarade han såhär:

"De två första raderna skapar en vektor (=fält) u som är dubbelt så lång som vektorn v och som innehåller enbart nollor. Det man ska göra i loopen sedan är att man på de platser med jämnt index i u ska man placera elementen som finns i v. Alltså elementet med index 2*j i u ska vara lika med elementet med index j i v. Loopen ska alltså köras lika många varv som v är lång och det man man uppnå med att t.ex. använda np.arange (alternativt range som finns inbyggt i Python)."

Då löser han en annan uppgift än den som står. Kan man få honom att begripa det?

whsa1002 21
Postad: 7 mar 09:01

Jag har skickat koden till honom, den som fungerade i python, får se om jag får något svar. Vet att några i klassen löst den men inte lyckats få tag på någon än. Alltså vid dehär laget vet jag verkligen inte hur jag ska göra längre eftersom den koden inte fungerade...

Laguna Online 28709
Postad: 7 mar 09:18

Har du bytt ut den där explicita 4:an ännu? Det kan stå antingen len(u) eller int(vlen/2) där.

whsa1002 21
Postad: 7 mar 09:24

Provade följande, har nu kvar de första raderna som ska vara där enligt läraren.

Laguna Online 28709
Postad: 7 mar 09:25

Du får nog antingen bry dig om läraren eller oss, inte båda.

whsa1002 21
Postad: 7 mar 09:29

Det är sant, men eftersom han har skapat uppgiften måste jag väl försöka lösa den med de parametrar jag fått. Möbius godtar endast ett rätt svar. Uppgiften är redan löst med de parametrar jag fått från er! Men uppenbarligen finns det ett till sätt...

Finns säkert något smart sätt. Ser dock inte hur det skulle gå till. I alla fall inte på ett smidigt och snabbt sätt. 

whsa1002 21
Postad: 7 mar 11:29 Redigerad: 7 mar 11:30

Fick svar från min lärare nu, indenteringen i möbius gjorde att mitt svar var fel. Koden med var rätt!!

vlen=np.size(v)

u=np.zeros(int(vlen/2))

for k in range(4):

u(k)=v(2*k)

print....

 

Problem löst :)

Undra vad hans lösning var…

whsa1002 21
Postad: 7 mar 12:13

ja, det vill jag gärna veta

CurtJ 1159
Postad: 8 mar 09:55

Ursäkta sen kommentar men du har en grej kvar i "for k in range(4)". Som Laguna påpekar i #12 måste den vara mer generell om du vill att den ska fungera med någon annan indaga en än vektor som är 8 element lång. Du har använt vlen i dina tidigare inlägg/försök och det är väl en bra ide. Notera bara att den ska vara lika stor som din vektor u. 

Mrpotatohead 4687 – Tillträdande Moderator
Postad: 8 mar 09:57 Redigerad: 8 mar 09:57
CurtJ skrev:

Ursäkta sen kommentar men du har en grej kvar i "for k in range(4)". Som Laguna påpekar i #12 måste den vara mer generell om du vill att den ska fungera med någon annan indaga en än vektor som är 8 element lång. Du har använt vlen i dina tidigare inlägg/försök och det är väl en bra ide. Notera bara att den ska vara lika stor som din vektor u. 

Detta påpekades i inlägg #23 (och #28) :)

CurtJ 1159
Postad: 8 mar 11:26

Repetition är kunskapens moder. 

CurtJ skrev:

Repetition är kunskapens moder. 

Självklart. Ber om ursäkt🙏😌

CurtJ 1159
Postad: 8 mar 14:24

Du har inget att be om utsäkt för, jag uppskattar din obeservation.

Svara Avbryt
Close