33 svar
690 visningar
villsovaa behöver inte mer hjälp
villsovaa 925
Postad: 18 okt 2021 19:40

antal bokstäver

Hej! Här är en del av min kod:

 for i in range(antalbilar):
                regnummer = input("mata in registreringsnummer i format ABC123 eller ABC12A: ")
                for a in bokstäver:
                    if a not in regnummer:
                        print("fel registreringsnummer")
                    else:
                        for a in bokstäver:
                            for b in siffror:
                                if len(a) == 3 and len(b) == 3 in regnummer:

Jag vill säga att om det finns tre bokstäver och tre siffror i input så är det rätt. Jag använde därför len(a), men det funkar ej. 

SeriousCephalopod 2696
Postad: 18 okt 2021 20:21

Vad är i bokstäver listan?

Förstår inte varför du kör for loopar över denna lista? 

villsovaa 925
Postad: 18 okt 2021 20:26
SeriousCephalopod skrev:

Vad är i bokstäver listan?

Förstår inte varför du kör for loopar över denna lista? 

I bokstavslistan finns alla bokstäver i en sträng, dvs a="abcdefghijklmnopqrstuvwxyzåäö". 

Finns det något annat förslag istället för for-loop?

Lindehaven 820 – Lärare
Postad: 18 okt 2021 21:57

Med slicing blir koden både kortare och mer lättläst. Nyttja Pythons strängfunktioner, t ex isalpha(), isdigit() och isalnum().

CurtJ Online 1201
Postad: 18 okt 2021 21:59

Är det inte smartare att loopa igenom regnummer och se om de 6 tecknen är bokstav eller siffror som @Lindehaven skriver.

Annars finns det en klass regEx som använder något som heter regular expressions där du kan kontrollera strängen med ett anrop men det kanske är överkurs?

CurtJ Online 1201
Postad: 18 okt 2021 22:03 Redigerad: 18 okt 2021 22:09

Pythons strängmetoder tar bara hänsyn till ascii (a-z) har jag för mig så din lista "bokstäver" kan nog va bra att använda om du inte vill använda regEx. Dessutom tillåter inte python andra bokstäver än de som ingår i ascii (A-Z, a-z) så bokstäver får du döpa om.

villsovaa 925
Postad: 18 okt 2021 22:42
Lindehaven skrev:

Med slicing blir koden både kortare och mer lättläst. Nyttja Pythons strängfunktioner, t ex isalpha(), isdigit() och isalnum().

Fast dessa ger ju bara true och false. 

villsovaa 925
Postad: 18 okt 2021 22:43
CurtJ skrev:

Är det inte smartare att loopa igenom regnummer och se om de 6 tecknen är bokstav eller siffror som @Lindehaven skriver.

Annars finns det en klass regEx som använder något som heter regular expressions där du kan kontrollera strängen med ett anrop men det kanske är överkurs?

Jag tror att det är det jag försöker göra men får inte grepp om hur det ska gå till. 

CurtJ Online 1201
Postad: 18 okt 2021 23:11 Redigerad: 18 okt 2021 23:13

Om du har definierat bokstaver

bokstaver="ABCDEFGHIJKLMNOPQRSTUVXYZÅÄÖ"

och läst in regnummer från användaren

så kan du loopa igen regnummer och kolla varje tecken i regnumret

for a in regnummer:

    if (not a in bokstaver and not a.isdigit()):

        #Gör vad du ska om det är otillåtna tecken i regnumret.

Notera här att bokstaver bara innehåller versaler så ska du tillåta inmatning av små bokstäver så behöver du utöka listan bokstaver, alternativt så gör du om regnummer till versaler med metoden upper() först

typ

for a in regnummer.upper():

Som @Lindehaven skriver så kan du också använda slicing som kan se elegantare ut men det är en fråga om tycke och smak.

Att använda regEx är ännu elegantare och effektivare tycker jag men har man svenska tecken så är det meckigt att få till lite beroende på vilken version av python man använder och det är definitivt överkurs för den här nivån av problem.

 

Lindehaven 820 – Lärare
Postad: 19 okt 2021 07:55

Om man ska tro Wikipedia så förekommer inte å, ä och ö på registreringsskyltar. Variabeln bokstaver behövs därför inte och Pythons strängmetoder kan användas. Det stämmer att de returnerar False eller True. Det gör att uttrycket för att utvärdera ett registreringsnummer reduceras till ett logiskt uttryck med ett fåtal and-operatorer.

Laguna 30518
Postad: 19 okt 2021 09:50

Bokstäverna I och V förekommer inte heller, tror jag.


Tillägg: 19 okt 2021 09:56

En sak din kod gör nu är att ta varje bokstav som finns och se om den förekommer i registreringsnumret. Det finns det förstås alltid nån bokstav som inte gör, så då säger du "fel registreringsnummer".

 

Det är bra att torrsimma koden: hitta på nån input och kolla sedan vad koden gör, steg för steg. Antingen i huvudet, eller med papper och penna som hjälp, men utan dator.

Ett annat sätt är att använda en debugger och köra programmet steg för steg.

Ett tredje sätt är att lägga in spårutskrifter (alltså vanliga print-satser) som visar hur programmet kör.

 

Lindehaven 820 – Lärare
Postad: 19 okt 2021 11:45

Ett fjärde sätt som alla bör använda är automatiserade tester. Definiera en funktion som tar en sträng som parameter och returnerar True om strängen är ett giltigt registreringsnummer, annars False. Testa sedan funktionen med olika giltiga och ogiltiga registreringsnummer för att se om den gör rätt.

villsovaa 925
Postad: 19 okt 2021 18:16
CurtJ skrev:

Om du har definierat bokstaver

bokstaver="ABCDEFGHIJKLMNOPQRSTUVXYZÅÄÖ"

och läst in regnummer från användaren

så kan du loopa igen regnummer och kolla varje tecken i regnumret

for a in regnummer:

    if (not a in bokstaver and not a.isdigit()):

        #Gör vad du ska om det är otillåtna tecken i regnumret.

Notera här att bokstaver bara innehåller versaler så ska du tillåta inmatning av små bokstäver så behöver du utöka listan bokstaver, alternativt så gör du om regnummer till versaler med metoden upper() först

typ

for a in regnummer.upper():

Som @Lindehaven skriver så kan du också använda slicing som kan se elegantare ut men det är en fråga om tycke och smak.

Att använda regEx är ännu elegantare och effektivare tycker jag men har man svenska tecken så är det meckigt att få till lite beroende på vilken version av python man använder och det är definitivt överkurs för den här nivån av problem.

 

Men hur kan jag med hjälp av denna kod säga åt programmet att endast inmatning som är tre bokstäver sen tre siffror är rätt? testade med 3*a men det funkade inte.

villsovaa 925
Postad: 19 okt 2021 19:22 Redigerad: 19 okt 2021 19:25
Lindehaven skrev:

Ett fjärde sätt som alla bör använda är automatiserade tester. Definiera en funktion som tar en sträng som parameter och returnerar True om strängen är ett giltigt registreringsnummer, annars False. Testa sedan funktionen med olika giltiga och ogiltiga registreringsnummer för att se om den gör rätt.

Har försökt göra detta med regex nu som du tipsade, där om input har tre bokstäver i början och tre i slutet att den ska lägga till i listan, annars printa "fel registreringsnummer". Men även om jag skriver rätt, dvs AAABBB, så printas "fel registreringsnummer". 

for a in bokstäver:
                    x = re.search("^a{3}\d{3}$", regnummer)
                    if x:
                     lista_stulnabilar = lista_stulnabilar.append(regnummer)
                    else:
                        print("fel registreringsnummer")

 Kanske använder jag regex fel?

Lindehaven 820 – Lärare
Postad: 20 okt 2021 07:46

Varför iterera strängen bokstaver?

"AAABBB" är inte ett giltigt registreringsnummer.

Det reguljära uttrycket "^a{3}\d{3}$" söker efter "aaa" följt av tre siffror vilket inte är korrekt.

Det reguljära uttrycket bör söka efter tre giltiga bokstäver + två siffror + en siffra eller en giltig bokstav. Exempelvis "^[A-HJ-PR-UW-Z]{3}\d{2}[0-9A-HJ-PR-UW-Z]$"

re.search() returnerar inte True eller False. Den returnerar ett objekt om den fann det reguljära uttrycket, annars None.

villsovaa 925
Postad: 20 okt 2021 19:18
Lindehaven skrev:

Varför iterera strängen bokstaver?

"AAABBB" är inte ett giltigt registreringsnummer.

Det reguljära uttrycket "^a{3}\d{3}$" söker efter "aaa" följt av tre siffror vilket inte är korrekt.

Det reguljära uttrycket bör söka efter tre giltiga bokstäver + två siffror + en siffra eller en giltig bokstav. Exempelvis "^[A-HJ-PR-UW-Z]{3}\d{2}[0-9A-HJ-PR-UW-Z]$"

re.search() returnerar inte True eller False. Den returnerar ett objekt om den fann det reguljära uttrycket, annars None.

Vad kan man ha istället för re.search()? liksom om jag skriver elif "^[A-HJ-PR-UW-Z]{3}\d{2}[0-9A-HJ-PR-UW-Z]$" in regnummer:

Så kollar den ju bara om hela uttrycket finns i regnummer, eftersom jag satt citationstecken. Måste man inte ha ett reg-kommando?

Laguna 30518
Postad: 20 okt 2021 19:20

Hur tänker du när du svarar påfrågan alldeles själv? Om du får se skylten AB2 458, hur resonerar du?

villsovaa 925
Postad: 20 okt 2021 19:27
Laguna skrev:

Hur tänker du när du svarar påfrågan alldeles själv? Om du får se skylten AB2 458, hur resonerar du?

att det är fel? förlåt förstår inte vad du menar. Det jag undrar är vad man kan använda för reg-kommando istället för reg.search(). Har inte gått igenom detta och blev intresserad av att lära mig hur reg funkar. Hittade bara reg.search() på internet som jag faktiskt förstod. 

Laguna 30518
Postad: 20 okt 2021 19:35

Hur tänker du? Om du ska förklara för någon varför det inte är en svensk skylt, vad säger du då?

villsovaa 925
Postad: 20 okt 2021 19:49
Laguna skrev:

Hur tänker du? Om du ska förklara för någon varför det inte är en svensk skylt, vad säger du då?

Det är inte en svensk skylt eftersom en svensk skylt innehåller antingen tre bokstäver följt av tre siffror, eller tre bokstäver följt av två siffror och en bokstav. 

Försökte utan regex förresten, vet ej om det är rätt:

 elif regnummer[:3] in bokstäver and regnummer[:-3] in siffror:
                    continue
                    if regnummer[:3] in bokstäver and regnummer[:-1] in bokstäver and regnummer[3:5] in siffror:
                        continue
                    else:
                        print("fel")

Visst borde det bli rätt?

Men, jag har ett annat problem. För sen, efteråt, har jag en elif-sats med alla bokstavskombinationer som man inte får ha.

elif "APA" or "ARG" or "ASS" or "BAJ" or "BSS" or "CUC" or "CUK" or "DUM" or "ETA" or "ETT" or "FAG" or "FAN" or "FEG" or "FEL" or "FEM" or "FES" or "FET" or "FNL" or "FUC" or "FUK" or "FUL" or "GAM" or "GAY" or "GEJ" or "GEY" or "GHB" or "GUD" or "GYN" or "HAT" or "HBT" or "HKH" or "HOR" or "HOT" or "KGB" or "KKK" or "KUC" or "KUF" or "KUG" or "KUK" or "KYK" or "LAM" or "LAT" or "LEM" or "LOJ" or "LSD" or "LUS" or "MAD" or "MAO" or "MEN" or "MES" or "MLB" or "MUS" or "NAZ" or "NRP" or "NSF" or "NYP" or "OND" or "OOO" or "ORM" or "PAJ" or "PKK" or "PLO" or "PMS" or "PUB" or "RAP" or "RAS" or "ROM" or "RPS" or "RUS" or "SEG" or "SEX" or "SJU" or "SOS" or "SPY" or "SUG" or "SUP" or "SUR" or "TBC" or "TOA" or "TOK" or "TRE" or "TYP" or "UFO" or "USA" or "WAM" or "WAR" or "WWW" or "XTC" or "XTZ" or "XXL" or "XXX" or "ZEX" or "ZOG" or "ZPY" or "ZUG" or "ZUP" or "ZOO" in regnummer:
                  
                    print("fel registreringsnummer")

Men om jag skriver in exempelvis "ABC123" så får jag "fel registreringsnummer" som beror på något konstigt med just denna ovan och inte de andra elif-satserna. Varför fungerar inte detta?

Laguna 30518
Postad: 20 okt 2021 19:56
villsovaa skrev:
Laguna skrev:

Hur tänker du? Om du ska förklara för någon varför det inte är en svensk skylt, vad säger du då?

Det är inte en svensk skylt eftersom en svensk skylt innehåller antingen tre bokstäver följt av tre siffror, eller tre bokstäver följt av två siffror och en bokstav. 

Så vad är det som är fel med skylten, och hur snabbt upptäcker du det?

villsovaa 925
Postad: 20 okt 2021 19:59
Laguna skrev:
villsovaa skrev:
Laguna skrev:

Hur tänker du? Om du ska förklara för någon varför det inte är en svensk skylt, vad säger du då?

Det är inte en svensk skylt eftersom en svensk skylt innehåller antingen tre bokstäver följt av tre siffror, eller tre bokstäver följt av två siffror och en bokstav. 

Så vad är det som är fel med skylten, och hur snabbt upptäcker du det?

Inmatningen är fel? Borde upptäckas när man skrivit in?

Laguna 30518
Postad: 20 okt 2021 20:07

Jag menar fortfarande hur du själv gör. Har du regexpar inprogrammerade i huvudet?

villsovaa 925
Postad: 20 okt 2021 20:09
Laguna skrev:

Jag menar fortfarande hur du själv gör. Har du regexpar inprogrammerade i huvudet?

Felet med skylten är att det som står är fel. Det upptäcks när man köper bilen. Känner att vi har hamnat lite off track här.

Laguna 30518
Postad: 20 okt 2021 20:17

Datorn har samma information som du. Du använder också en algoritm. Om du formulerar den i ord så har du en algoritm som fungerar i datorn också.

villsovaa 925
Postad: 20 okt 2021 20:27
Laguna skrev:

Datorn har samma information som du. Du använder också en algoritm. Om du formulerar den i ord så har du en algoritm som fungerar i datorn också.

Men varför fungerar inte det här senaste jag gjorde som jag skrev utan regex? För det är så jag skulle formulerat det. 

Laguna 30518
Postad: 20 okt 2021 20:41

Om strängen av de tre första bokstäverna ingår i strängen av alla bokstäver i alfabetet? "ABC" gör faktiskt det, men t.ex. "ABX" finns inte i "ABCDEFGHIJKLMNOPQRSTUVWXYZ".

villsovaa 925
Postad: 20 okt 2021 20:43
Laguna skrev:

Om strängen av de tre första bokstäverna ingår i strängen av alla bokstäver i alfabetet? "ABC" gör faktiskt det, men t.ex. "ABX" finns inte i "ABCDEFGHIJKLMNOPQRSTUVWXYZ".

JAHAAAAA. Men hur gör man då? Ska man göra for a in range bokstäver?

villsovaa 925
Postad: 20 okt 2021 20:58
Laguna skrev:

Om strängen av de tre första bokstäverna ingår i strängen av alla bokstäver i alfabetet? "ABC" gör faktiskt det, men t.ex. "ABX" finns inte i "ABCDEFGHIJKLMNOPQRSTUVWXYZ".

Ok ändrade till

bokstäver = "A" or "B" or "C" or "D" or "E" or "F" or "G" or "H" or "J" or "K" or "L" or "M" or "N" or "O" or "P" or "R" or "S" or "T" or "U" or "W" or "X" or "Y" or "Z"

siffror = "0" or "1" or "2" or "3" or "4" or "5" or "6" or "7" or "8" or "9"

elif regnummer[:3] not in bokstäver:
                    system("clear")
                    print("fel")
                elif regnummer[3:5] not in siffror:
                    system("clear")
                    print("fel")

men det funkar fortfarande inte. Det ger mig fel när jag skriver in tex "ACV133"

Laguna 30518
Postad: 20 okt 2021 21:01

Man har mycket glädje av att prova saker i en interaktiv Python. Starta python och skriv in

"A" or "B"

och se vad det blir.

villsovaa 925
Postad: 20 okt 2021 21:02
Laguna skrev:

Man har mycket glädje av att prova saker i en interaktiv Python. Starta python och skriv in

"A" or "B"

och se vad det blir.

vad är en "interaktiv python"?

Laguna 30518
Postad: 20 okt 2021 22:17

Starta python utan att ge den någon fil att läsa in.

Lindehaven 820 – Lärare
Postad: 21 okt 2021 09:01
villsovaa skrev:
Lindehaven skrev:

Varför iterera strängen bokstaver?

"AAABBB" är inte ett giltigt registreringsnummer.

Det reguljära uttrycket "^a{3}\d{3}$" söker efter "aaa" följt av tre siffror vilket inte är korrekt.

Det reguljära uttrycket bör söka efter tre giltiga bokstäver + två siffror + en siffra eller en giltig bokstav. Exempelvis "^[A-HJ-PR-UW-Z]{3}\d{2}[0-9A-HJ-PR-UW-Z]$"

re.search() returnerar inte True eller False. Den returnerar ett objekt om den fann det reguljära uttrycket, annars None.

Vad kan man ha istället för re.search()? liksom om jag skriver elif "^[A-HJ-PR-UW-Z]{3}\d{2}[0-9A-HJ-PR-UW-Z]$" in regnummer:

Så kollar den ju bara om hela uttrycket finns i regnummer, eftersom jag satt citationstecken. Måste man inte ha ett reg-kommando?

Du behöver läsa och försöka förstå de tips vi ger dig. Om du svarar på våra frågor så leder vi dig vidare.

Jag skrev ett exempel på vad det reguljära uttrycket kan vara och att re.search() returnerar ett objekt eller False. Då kan man prova om det reguljära uttrycket matchar det registreringsnummer som angetts. Exempelvis så här:

    # Säkerställ att tecknen är versaler för att förenkla kontrollen av registreringsnumret
    regnummer = regnummer.upper()
    # Kontrollera om registreringsnumret är korrekt med hjälp av ett reguljärt uttryck
    objekt = re.search('^[A-HJ-PR-UW-Z]{3}\d{2}[0-9A-HJ-PR-UW-Z]$', regnummer)
    # Om registreringsnumret är korrekt så ...
    if objekt != None:
        # ... gör din grej
villsovaa 925
Postad: 21 okt 2021 18:52

Jag har löst det, tack för hjälpen

Svara
Close