Anagram Programm Hilfe

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Unxendlicher
User
Beiträge: 15
Registriert: Freitag 28. Januar 2022, 20:18

Code: Alles auswählen

def is_anagram(firstWord, secondWord):
    laenge = len(firstWord)
    list = []

    for nr in range(0, laenge):

        for nr1 in range(0, laenge):

            check = firstWord[nr1]             #buchstaben vergleichen
            if check != secondWord[nr]:
                ausgabewert = False
                list.append(ausgabewert)
            else:
                ausgabewert = True
                list.append(ausgabewert)
                break
        print(list)



    return list, laenge
    
list, laenge = is_anagram("scare", "races")

#if list  == True:   
#    ausgabe = True
#else:
#    ausgabe = False
#print(ausgabe)
Hallo,
Mein Problem ist das ich eine Liste bekomme mit True und False Werten und am Ende nachdem ich die Funktion aufgerufen habe möchte ich auswerten ob es ein Anagram ist oder nicht.
Nur ich habe echt keine Ahnung wie ich dies anstellen soll. Das einzige was ich mir denken kann ist das ich ja ein Wort mit 5 Zeichen habe und wenn es ein Anagram ist hat die Liste auch 5 mal den Wert True und wenn es kein ANagram ist hat sie max. 4 mal True.
Es wäre nett wenn mir jemand helfen kann und am besten dazu noch möglichst genau erklären kann wie es den funktioniert, da ich noch recht neu in der Entwicklung bin, danke!
Benutzeravatar
__blackjack__
User
Beiträge: 14078
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Unxendlicher: Was hast Du Dir denn dabei gedacht die Listen zu erstellen? Was ist die Idee dahinter? Oder ist der Code nicht von Dir? Dann solltest Du den gleich wieder vergessen und Dir selbst Gedanken machen. Wie würdest Du denn da ohne Rechner dran gehen, mit Papier und Bleistift?

Es gibt dazu auch eine sehr einfache Lösung. In dem man sich eine ”kanonische” Form überlegt in die man Worte bringen kann und das macht man dann mit beiden Worten und vergleicht dann die Ergebnisse. Das ist im Grunde ein Einzeiler.

Anmerkungen zum Quelltext: Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase).

Grunddatentypen haben nichts in Namen verloren. Und schon gar nicht sollte ein Name wie `list` an etwas anderes gebunden werden als den eingebauten Datentyp `list`, denn ab da kann man in dem Namensraum `list()` nicht mehr verwenden und es verwirrt den Leser das `list` etwas anderes bedeutet als man annimmt.

Namen sollten nicht nummeriert werden. Entweder will man bessere Namen verwenden, oder gar keine Einzelnamen sondern eine Datenstruktur. Oft eine Liste. In diesem Fall einfach bessere Namen, wie `i` und `j` was übliche Namen für Indexwerte sind, aaaaber:

``for i in range(len(sequence)):`` nur um dann `i` als Index in `sequence` zu verwenden ist in Python ein „anti pattern“. Man kann direkt über die Werte iterieren, ohne den unnötigen Umweg über einen Laufindex.

Eine Funktion/Methode mit einem Namen `is_something()` sollte einen Wahrheitswert zurückgeben und nichts anderes oder zusätzliches. Die Länge des ersten Wortes zurückzugeben macht auch keinen Sinn, denn der Aufrufer hat dieses erste Wort ja übergeben, hat also bereits Zugriff auf diesen Wert und kann auch trivial die Länge davon abfragen.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
__blackjack__
User
Beiträge: 14078
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Nachtrag: Der Testcase ist auch nicht so gut, weil Du da mit einer ”Lösung” durchkommen könntest die beispielsweise ``is_anagram("testcase", "cassette")`` *nicht* erkennen würde, wenn ich mir Deinen Ansatz so anschaue, oder aber andere Fälle fälschlicherweise als Anagram erkennen würde.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Sirius3
User
Beiträge: 18279
Registriert: Sonntag 21. Oktober 2012, 17:20

Variablennamen werden komplett klein geschrieben. Die vielen Leerzeilen tragen nicht zur Lesbarkeit bei.
`list` ist ein schlechter Variablenname, weil er den Typ `list` verdeckt.
Du hast fast alle Variablen auf englisch, bis auf `laenge`. `check` ist ein schlechter Name für einen Buchstaben.
`ausgabewert` wird eigentlich nicht gebraucht, weil man gleich True bzw. False an die Liste anhängen kann.
Über einen Index iteriert man nicht, weil man direkt über die Buchstaben des Strings iterieren kann.
Wir kommen also zu diesem Code:

Code: Alles auswählen

def is_anagram(first_word, second_word):
    result = []
    for character1 in first_word:
        for character2 in second_word:
            if character1 != character2:
                result.append(False)
            else:
                result.append(True)
                break
    return result
Warum fügst Du False zur Liste hinzu, wenn Du es gar nicht verwenden willst?

Code: Alles auswählen

def is_anagram(first_word, second_word):
    result = []
    for character1 in first_word:
        for character2 in second_word:
            if character1 == character2:
                result.append(True)
                break
    return result
Nun ist die inner for-Schleife ein einfacher Vergleich, ob ein Zeichen in einer Zeichenkette vorkommt:

Code: Alles auswählen

def is_anagram(first_word, second_word):
    result = []
    for character in first_word:
        if character in second_word:
            result.append(True)
    return result
Was man, leicht in eine Listcomprehension umwandeln kann:

Code: Alles auswählen

def is_anagram(first_word, second_word):
    return [True for character in first_word if character in second_word]
Oder, da es nur um die Anzahl der Trues geht:

Code: Alles auswählen

def is_anagram(first_word, second_word):
    return sum(character in second_word for character in first_word)
Die eigentliche Frage ist, was hast Du Dir bei der Liste gedacht.
Wie soll die Liste dabei helfen, zu entscheiden, ob ein Wort ein Anagram zu einem anderen Wort ist?
Was ist die Eigenschaft eines Anagrams?
Benutzeravatar
ThomasL
User
Beiträge: 1379
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Ein Wort ist ein Anagramm zu einem anderen Wort, wenn beide Wörter die gleiche Anzahl der selben Buchstaben haben.

abba, aabb, bbaa, baab, baba, abab sind untereinander Anagramme.

Wenn zwei Wörter nicht die gleiche Anzahl Buchstaben haben, können sie keine Anagramme sein.

Code: Alles auswählen

def is_anagram(a, b):
    return len(a) == len(b) and sorted(a.lower()) == sorted(b.lower())

is_anagram('Lagerregal', 'Garllarege')
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Unxendlicher
User
Beiträge: 15
Registriert: Freitag 28. Januar 2022, 20:18

__blackjack__ hat geschrieben: Montag 14. Februar 2022, 14:10 @Unxendlicher: Was hast Du Dir denn dabei gedacht die Listen zu erstellen? Was ist die Idee dahinter? Oder ist der Code nicht von Dir? Dann solltest Du den gleich wieder vergessen und Dir selbst Gedanken machen. Wie würdest Du denn da ohne Rechner dran gehen, mit Papier und Bleistift?

Es gibt dazu auch eine sehr einfache Lösung. In dem man sich eine ”kanonische” Form überlegt in die man Worte bringen kann und das macht man dann mit beiden Worten und vergleicht dann die Ergebnisse. Das ist im Grunde ein Einzeiler.

Anmerkungen zum Quelltext: Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase).

Grunddatentypen haben nichts in Namen verloren. Und schon gar nicht sollte ein Name wie `list` an etwas anderes gebunden werden als den eingebauten Datentyp `list`, denn ab da kann man in dem Namensraum `list()` nicht mehr verwenden und es verwirrt den Leser das `list` etwas anderes bedeutet als man annimmt.

Namen sollten nicht nummeriert werden. Entweder will man bessere Namen verwenden, oder gar keine Einzelnamen sondern eine Datenstruktur. Oft eine Liste. In diesem Fall einfach bessere Namen, wie `i` und `j` was übliche Namen für Indexwerte sind, aaaaber:

``for i in range(len(sequence)):`` nur um dann `i` als Index in `sequence` zu verwenden ist in Python ein „anti pattern“. Man kann direkt über die Werte iterieren, ohne den unnötigen Umweg über einen Laufindex.

Eine Funktion/Methode mit einem Namen `is_something()` sollte einen Wahrheitswert zurückgeben und nichts anderes oder zusätzliches. Die Länge des ersten Wortes zurückzugeben macht auch keinen Sinn, denn der Aufrufer hat dieses erste Wort ja übergeben, hat also bereits Zugriff auf diesen Wert und kann auch trivial die Länge davon abfragen.
Ich bin wie gesagt noch neu und lerne Python mit einem Buch und seit neuem nutze ich auch einige Webseiten, das Problem ist nur das ich auf jeder Seite andere Namen für Variablen, Codearten etc bekomme. zb in dem Buch werden deutsche Begriffe benutzt auf Internet Seiten meist englisch und so ist das halt sehr schwer da immer guten Code zu schreiben.
Und Ja der Code ist von mir selber geschrieben.
Antworten