Listor (Retunera det längsta ordet)
Frågan lyder: Skriv ett Python-program som läser från användaren en lång textrad bestående av flera ord avdelade med mellanslag. Med ord här menas bara följder av icke-blanka tecken avslutade av
mellanslag eller slutet på strängen. Programmet ska skriva ut hur många ord som finns i
texten och vilket som är det längsta ordet.
Mitt problem är att den skriver ut hela listan istället för att säga vilken den längsta var gällande kod från alternativ 1. Alternativ 2. Säger endast att vi har det längsta ordet i index ... tex. Men jag vet inte hur jag ska översätta index tex 3 som hade längsta ordet till att skriva " Det längsta ordet var" , " Sverige". Behöver hjälp med lösningar till alt.1 och alt.2
vad innebär 'list' object has no attribute 'split' ? när jag gör en listans namn ochsedan .split() varför går det inte?
Alternativ två för längsta ordet:
lengths = [0] * 20
#words= Ord
#max_string= None
#for w in words:
#w = w.lower()
#lengths[len(w)] +=1
#max_string = w
#print("Längsta ordet du skrev", lengths[len(w)])
Min kod:
Ord =[]
user = str(input("Skriv en text: ")).split()
Ord.append(user)
print(Ord)
max_length= 0
max_string= None
for string in words:
if len(string) > max_length:
max_length = len(string)
max_string = string
print("Längsta ordet",max_string)
print("Youwrote" , len(user), "words")
print("Det första ordet var", Ord[0][0])
print("Det sista ordet du skrev var", Ord[0][-1])
Du verkar ha missat att kopiera in alternativ 1. För övrigt förstår jag inte alls vad du menar med de olika alternativen. Är det kod du fått som det är tänkt att du ska använda? Varför är koden bortkommenterad under alternativ 2? Förtydliga gärna så kan jag försöka hjälpa dig.
Förlåt för att jag var otydlig. Så jag vill ta fram en kod som via användarens input till listan anger vilket det längsta ordet var.
I och med att första koden inte fungera försökte via andra vägar. Alternativ 1 och 2 är koder på hur man kan ta fram längsta ordet. Där
Alt.1
max_length= 0
max_string= None
for string in words:
if len(string) > max_length:
max_length = len(string)
max_string = string
print("Längsta ordet",max_string)
och Alt 2.
lengths = [0] * 20
#words= Ord
#max_string= None
#for w in words:
#w = w.lower()
#lengths[len(w)] +=1
#max_string = w
#print("Längsta ordet du skrev", lengths[len(w)])
Sedan fick jag även en fel exekverings kod som lyder 'list' object has no attribute 'split' ? när jag gör en listans namn ochsedan .split() varför går det inte?
Detta när jag försökte göra w = w.lower() i alternativ 2
Alternativ 1 är faktiskt rätt. Alt 2 förstår jag inte hur det funkar, men jag tror du överkomplicerar det. Felet gör du när du tar input från användaren och sparar i en lista.
Du gör så här:
Ord =[]
user = str(input("Skriv en text: ")).split()
Ord.append(user)
Vad som händer är att du skapar den tomma listan Ord
, sedan tar du input från användaren och delar upp strängen i en lista och sparar listan i variabeln user
. Sedan lägger du till user
i listan Ord
. Ord
blir då alltså en lista som innehåller en lista som i sin tur inehåller orden, men koden i alt 1 förväntar sig bara en lista som direkt innehåller orden. Man kan tro att append()
kopierar över elementen från en lista i en annan lista, men den kopierar alltså över hela listan i sig.
Eftersom funktionen split()
redan returnerar en lista finns det ingen poäng att blanda in en annan lista, så det räcker att skriva ord = input("Skriv en text: ").split()
. Notera också att jag tog bort str()
, eftersom input()
redan returnerar en sträng.
Detta är en av anledningarna till varför jag inte tycker python borde läras ut till nybörjare. Det är lätt att skriva python-kod men också väldigt lätt att göra misstag som detta. Många andra språk hade inte tillåtit att du gör misstaget alls.
Du får ett felmeddelande när du försöker köra split() på en lista eftersom split() bara fungerar på strängar. Vad split() gör är att dela upp en sträng i en lista. Vad vill du uppnå med att dela upp något som redan är en lista?