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)+']')
Läs på om funktionen på range. Där kan du stega varannat element och det borde lösa ditt problem .
Testa o återkom.
Om vlen är 8 så ska längden på u vara 4. Du ska alltså dela med 2, inte multiplicera.
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?
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
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.
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...
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?
Ja, detta är jag med på!
Kan du göra en loop med range då, som gör just detta?
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.
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.
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.]
Nånting skoj verkar hända med vektorn när man delar den med två.
Det jag menade var att dela vlen med två.
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
Du kommer antagligen vidare om du försöker tolka felmeddelandet. Hur lyder det?
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).
Eller använder operatorn //.
I Python 2 gav / en int i det här läget.
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!
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?
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)."
Jag tänkte att (vlen) skulle vara i rangen då det blir generaliserat
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?
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...
Har du bytt ut den där explicita 4:an ännu? Det kan stå antingen len(u) eller int(vlen/2) där.
Provade följande, har nu kvar de första raderna som ska vara där enligt läraren.
Du får nog antingen bry dig om läraren eller oss, inte båda.
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.
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…
ja, det vill jag gärna veta
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.
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) :)
Repetition är kunskapens moder.
CurtJ skrev:Repetition är kunskapens moder.
Självklart. Ber om ursäkt🙏😌
Du har inget att be om utsäkt för, jag uppskattar din obeservation.