flappelap
Artikelen: 0
Berichten: 1.356
Lid geworden op: za 30 dec 2017, 10:49

Python: fout in programma om strings te vergelijken

Ik ben sinds kort weer mijn Python wat aan het opfrissen aan de hand van Pieter Sproncks "De programmeursleerling". In één van de opgaven (8.2) moet je een programma schrijven dat twee strings vergelijkt en het aantal overeenkomende tekens teruggeeft. Er zijn uitwerkingen van de opgaven, maar ik wil graag begrijpen wat er in mijn poging misgaat. Bij strings van gelijke lengte werkt de methode, maar bij strings van ongelijke lengte (zoals "een" en "twee") print de code dikwijls "0 tekens gemeen"; blijkbaar doet mijn for-lus (for i in range(lengte)) op regel 10 het niet goed, en mijn vraag is waarom. Zie hier onder de code.

def gemeen(string1,string2):

aantal = 0

if len(string1) < len(string2):
lengte = len(string1)
else:
lengte = len(string2)

for i in range(lengte):
if string1 == string2:
aantal += 1
return aantal

string1 = str(input("Geef woord 1: "))
string2 = str(input("Geef woord 2: "))

num = gemeen(string1, string2)

if num == 0:
print("Niks gemeen")
elif num == 1:
print("Eén teken gemeen")
else:
print(num, "tekens gemeen")


Alle input is welkom :)
flappelap
Artikelen: 0
Berichten: 1.356
Lid geworden op: za 30 dec 2017, 10:49

Re: Python: fout in programma om strings te vergelijken

De post vernaggelt mijn inspringen wat ik niet goed krijg, dus ik hoop dat het zo duidelijk is.
Gebruikersavatar
Xilvo
Moderator
Artikelen: 0
Berichten: 10.725
Lid geworden op: vr 30 mar 2018, 16:51

Re: Python: fout in programma om strings te vergelijken

Code blijft goed als je code gebruikt '</>' in volledige bewerker & voorbeeld.
Gebruikersavatar
Xilvo
Moderator
Artikelen: 0
Berichten: 10.725
Lid geworden op: vr 30 mar 2018, 16:51

Re: Python: fout in programma om strings te vergelijken

Wat is de bedoeling? Wat wordt precies bedoeld met 'overeenkomende tekens'?
Hoeveel overeenkomende tekens hebben "twee" en "twweede"? Is dat 3, een "w" en twee maal "e"?
Edit: 4, natuurlijk, ik vergat de "t".

Dit stukje klopt volgens mij al niet, je vergelijkt steeds de hele string.

Code: Selecteer alles

for i in range(lengte):
    if string1 == string2:
    aantal += 1
    return aantal
Als je dit doet

Code: Selecteer alles

for i in range(lengte):
    if string1[i] == string2[i]:
    aantal += 1
    return aantal
vergelijk je steeds de tekens op dezelfde plaats in de string. Dat zal ook de bedoeling niet zijn.
flappelap
Artikelen: 0
Berichten: 1.356
Lid geworden op: za 30 dec 2017, 10:49

Re: Python: fout in programma om strings te vergelijken

Poging twee:

Code: Selecteer alles

def gemeen(string1,string2):
   
    aantal = 0
    
    if len(string1) < len(string2):
        lengte = len(string1)
    else:
        lengte = len(string2)
        
    for i in range(lengte):
        if string1[i] == string2[i]:
            aantal += 1
    return aantal

string1 = str(input("Geef woord 1: "))
string2 = str(input("Geef woord 2: "))

num = gemeen(string1, string2)

if num == 0:
    print("Niks gemeen")
elif num == 1:
    print("Eén teken gemeen")
else:
    print(num, "tekens gemeen")
flappelap
Artikelen: 0
Berichten: 1.356
Lid geworden op: za 30 dec 2017, 10:49

Re: Python: fout in programma om strings te vergelijken

Xilvo schreef: ma 06 mei 2024, 11:36 Wat is de bedoeling? Wat wordt precies bedoeld met 'overeenkomende tekens'?
Hoeveel overeenkomende tekens hebben "twee" en "twweede"? Is dat 3, een "w" en twee maal "e"?

Dit stukje klopt volgens mij al niet, je vergelijkt steeds de hele string.

Code: Selecteer alles

for i in range(lengte):
    if string1 == string2:
    aantal += 1
    return aantal
Als je dit doet

Code: Selecteer alles

for i in range(lengte):
    if string1[i] == string2[i]:
    aantal += 1
    return aantal
vergelijk je steeds de tekens op dezelfde plaats in de string. Dat zal ook de bedoeling niet zijn.
Dat had-ie ook al niet goed meegekopieerd, da's vreemd. Ik heb de code hierboven nog eens gezet, kan mijn OP irritant genoeg ook niet meer aanpassen.

Ik zie je punt overigens inderdaad, de string worden nu op dezelfde plaats vergeleken, dat gaat niet goed. Ook de volgorde van strings invoeren lijkt uit te maken, wat ook niet de bedoeling is; je zou met deze code eerst beide strings moeten verwisselen, wat omslachtig is. Ik begrijp nu in elk geval waarom de uitwerking van de opgave het over een andere boeg gooit.
Gebruikersavatar
Xilvo
Moderator
Artikelen: 0
Berichten: 10.725
Lid geworden op: vr 30 mar 2018, 16:51

Re: Python: fout in programma om strings te vergelijken

Je zou van een van de strings de unieke letter moeten bepalen (van "twee" dus "t", "w", "e") en dan van ieder van die letters kijken hoe vaak ze in iedere string voorkomen. Dat gaat makkelijk met "set" maar zelf programmeren is misschien leerzamer.
Steeds het minimum van die aantallen nemen en optellen.
Gebruik ook zoveel mogelijk wat Python biedt, dus in plaats van

Code: Selecteer alles

if len(string1) < len(string2):
    lengte = len(string1)
else:
    lengte = len(string2)
dit:

Code: Selecteer alles

lengte=min(len(string1),len(string2))
EvilBro
Artikelen: 0
Berichten: 7.081
Lid geworden op: vr 30 dec 2005, 09:45

Re: Python: fout in programma om strings te vergelijken

@flappelap: Mocht je in de toekomst vaker dit soort vragen willen stellen, zorg er dan voor dat het stukje code dat je post jouw probleem daadwerkelijk toont. Als ik nu jouw voorbeeld van "een" en "twee" ingeef dan krijg ik niet wat je beweert.

Daarbij is het vaak ook handig om de oorspronkelijke vraag te posten. Een deel van het probleem hier is dat jij iets anders aan het doen bent dan de opgave vraagt.
Schrijf een functie die twee strings krijgt als parameters. De functie retourneert het aantal tekens dat de strings gemeen hebben. Ieder teken wordt slechts eenmalig geteld, bijvoorbeeld, de strings "een" en "peer" hebben slechts één teken gemeen(de letter “e”). Je mag hoofdletters zien als verschillend van kleine letters.

Code: Selecteer alles

def numberOfSharedCharacters(string1, string2):
  return len(set(string1).intersection(set(string2)))

string1 = str(input("Geef woord 1: "))
string2 = str(input("Geef woord 2: "))

num = numberOfSharedCharacters(string1, string2)
print("Aantal gedeelde tekens is", num)
flappelap
Artikelen: 0
Berichten: 1.356
Lid geworden op: za 30 dec 2017, 10:49

Re: Python: fout in programma om strings te vergelijken

Xilvo schreef: ma 06 mei 2024, 12:03 Je zou van een van de strings de unieke letter moeten bepalen (van "twee" dus "t", "w", "e") en dan van ieder van die letters kijken hoe vaak ze in iedere string voorkomen. Dat gaat makkelijk met "set" maar zelf programmeren is misschien leerzamer.
Steeds het minimum van die aantallen nemen en optellen.
Gebruik ook zoveel mogelijk wat Python biedt, dus in plaats van

Code: Selecteer alles

if len(string1) < len(string2):
    lengte = len(string1)
else:
    lengte = len(string2)
dit:

Code: Selecteer alles

lengte=min(len(string1),len(string2))
Dank. Ja, ik probeer nog teveel om zelf zaken te programmeren in plaats van gebruik te maken van de functionaliteit van Python.
flappelap
Artikelen: 0
Berichten: 1.356
Lid geworden op: za 30 dec 2017, 10:49

Re: Python: fout in programma om strings te vergelijken

EvilBro schreef: ma 06 mei 2024, 12:49 @flappelap: Mocht je in de toekomst vaker dit soort vragen willen stellen, zorg er dan voor dat het stukje code dat je post jouw probleem daadwerkelijk toont. Als ik nu jouw voorbeeld van "een" en "twee" ingeef dan krijg ik niet wat je beweert.

Daarbij is het vaak ook handig om de oorspronkelijke vraag te posten. Een deel van het probleem hier is dat jij iets anders aan het doen bent dan de opgave vraagt.
Schrijf een functie die twee strings krijgt als parameters. De functie retourneert het aantal tekens dat de strings gemeen hebben. Ieder teken wordt slechts eenmalig geteld, bijvoorbeeld, de strings "een" en "peer" hebben slechts één teken gemeen(de letter “e”). Je mag hoofdletters zien als verschillend van kleine letters.

Code: Selecteer alles

def numberOfSharedCharacters(string1, string2):
  return len(set(string1).intersection(set(string2)))

string1 = str(input("Geef woord 1: "))
string2 = str(input("Geef woord 2: "))

num = numberOfSharedCharacters(string1, string2)
print("Aantal gedeelde tekens is", num)
Ik heb de opgave niet letterlij gequote, maar "In één van de opgaven (8.2) moet je een programma schrijven dat twee strings vergelijkt en het aantal overeenkomende tekens teruggeeft." is toch de strekking van de opgave? Dank voor je oplossing, ik was nog niet bekend met de intersection methode, maar ik wou het ook graag met eigen code proberen.
Gebruikersavatar
Xilvo
Moderator
Artikelen: 0
Berichten: 10.725
Lid geworden op: vr 30 mar 2018, 16:51

Re: Python: fout in programma om strings te vergelijken

flappelap schreef: ma 06 mei 2024, 14:12 ...ik was nog niet bekend met de intersection methode, maar ik wou het ook graag met eigen code proberen.
De oplossing van EvilBro is natuurlijk prima maar je leert meer over de logica van programmeren als je het zelf programmeert.
Natuurlijk is het wel handig te weten dat andere, vaak kortere methodes, bestaan en waar je die kunt vinden.
EvilBro
Artikelen: 0
Berichten: 7.081
Lid geworden op: vr 30 dec 2005, 09:45

Re: Python: fout in programma om strings te vergelijken

flappelap schreef: ma 06 mei 2024, 14:12Ik heb de opgave niet letterlij gequote, maar "In één van de opgaven (8.2) moet je een programma schrijven dat twee strings vergelijkt en het aantal overeenkomende tekens teruggeeft." is toch de strekking van de opgave?
Misschien? Het kan natuurlijk aan mij liggen, maar als ik jouw parafrasering lees dan krijg ik het idee dat de bedoeling is dat je de strings over elkaar heenlegt en dan kijkt naar alle plekken waar hetzelfde teken staat. Dit dacht ik ook terug te zien in jouw code. Dat bleek echter niet de bedoeling te zijn.
flappelap
Artikelen: 0
Berichten: 1.356
Lid geworden op: za 30 dec 2017, 10:49

Re: Python: fout in programma om strings te vergelijken

EvilBro schreef: ma 06 mei 2024, 14:28
flappelap schreef: ma 06 mei 2024, 14:12Ik heb de opgave niet letterlij gequote, maar "In één van de opgaven (8.2) moet je een programma schrijven dat twee strings vergelijkt en het aantal overeenkomende tekens teruggeeft." is toch de strekking van de opgave?
Misschien? Het kan natuurlijk aan mij liggen, maar als ik jouw parafrasering lees dan krijg ik het idee dat de bedoeling is dat je de strings over elkaar heenlegt en dan kijkt naar alle plekken waar hetzelfde teken staat. Dit dacht ik ook terug te zien in jouw code. Dat bleek echter niet de bedoeling te zijn.
Ah, ok. Dat was niet de bedoeling inderdaad, en in de code deed ik dat ook onbedoeld fout.
Gebruikersavatar
physicalattraction
Moderator
Artikelen: 0
Berichten: 4.163
Lid geworden op: do 30 mar 2006, 15:37

Re: Python: fout in programma om strings te vergelijken

Xilvo schreef: ma 06 mei 2024, 14:21 De oplossing van EvilBro is natuurlijk prima maar je leert meer over de logica van programmeren als je het zelf programmeert.
Ik zou je eigenlijk wel aanraden om functionaliteit van Python te gebruiken vanaf het begin. Je algoritmes worden een stuk leesbaarder hierdoor, en je komt er later ook sneller op om zelf te gebruiken als je het al van begin af aan gebruikt. Je leert zelfs denken in sets, dictionaries en andere concepten die later zeer nuttig blijken te zijn.
Gebruikersavatar
Xilvo
Moderator
Artikelen: 0
Berichten: 10.725
Lid geworden op: vr 30 mar 2018, 16:51

Re: Python: fout in programma om strings te vergelijken

physicalattraction schreef: di 07 mei 2024, 19:34 Ik zou je eigenlijk wel aanraden om functionaliteit van Python te gebruiken vanaf het begin. Je algoritmes worden een stuk leesbaarder hierdoor, en je komt er later ook sneller op om zelf te gebruiken als je het al van begin af aan gebruikt. Je leert zelfs denken in sets, dictionaries en andere concepten die later zeer nuttig blijken te zijn.
Ik denk dat je beide moet doen. Natuurlijk is het handiger, sneller en (soms) leesbaarder als je ingebouwde functionaliteit van python, numpy etc. gebruikt.
Maar je leert eerst programmeren door eerst allerlei probleempjes met elementaire bewerkingen uit te voeren.
Niet voor niets zie je vaak opgaven als worteltrekken met de methode van Newton, hoewel iedere taal wel een ingebouwde opdracht voor worteltrekken kent.

Terug naar “Informatica en programmeren”