2017-12-05 5 views
2

Ich habe eine Scrabble Herausforderung und haben die folgende Liste von Buchstaben:Suche Liste von Wörtern in Scrabble mit leeren Kachel Python

letters = ['t', 'u', 'v', 'w', 'x', 'y', 'z'] 

Und folgende Liste von Wörtern:

word = ['apple', 'whisky', 'yutz', 'xray', 'tux', 'zebra'] 

Hier ist die Code ich verwende die Worte zu finden, die für eine gegebene Liste der Buchstaben gemacht werden können:

def valid_word(word, letters): 
    available_letters = letters[:] 

    candidate = True 

    for letter in word: 
     if letter not in available_letters:  
      candidate = False 
     else: 
      available_letters.remove(letter) 
    if candidate == True: 
     return candidate 

Es gibt mir die Ausgabe, dass zwei Wörter 'yutz' und 'tux' für die aktuelle Liste der Buchstaben gemacht werden können. in der Liste der Buchstaben mit leeren bezeichnet als '_' in der Liste

Meine Herausforderung ist was passiert, wenn wir eine des Brief ersetzen. Zum Beispiel 't' wird durch '_' unten ersetzt:

letters = ['_', 'u', 'v', 'w', 'x', 'y', 'z'] 

Wie kann die gleichen Worte zu finden ‚yutz‘ Code noch in der Lage sein und ‚tux‘, aber die fehlende Buchstaben ersetzen? Die erwartete Ausgabe ist 'yu_z' und '_ux'.

UPDATE:

Hier ist der Code, den ich versuchte, die nicht vollständig funktioniert aber irgendwie geben Richtung, wohin ich gehe:

rack_list = [] 
    for letter in letters: 
     if letter in string.ascii_lowercase: 
      rack_list.append(letter) 
     else: 
      blank_count = user_input.count("_") 

    def valid_word(word, rack): 
    available_letters = rack_list[:] 
    missed_counter = 0 

    for letter in word: 
     if letter in available_letters:  
      available_letters.remove(letter) 
     else: 
      missed_counter += 1 
    if missed_counter <= blank_count: 
     for i in word: 
      if i in available_letters: 
       word += i 
      else: 
       word += "_" 
     return word 
+0

Bitte beachten Sie die Buchungsrichtlinien. Dieses Problem unterscheidet sich von dem ursprünglichen Problem. Es sollte eine separate Frage sein. Vor allem haben Sie die Gültigkeit der Antworten auf Ihre ursprüngliche Frage wesentlich geändert. – Prune

+0

Incremental "Bitte helfen Sie mir" ist für einen Tutor, nicht Stack Overflow geeignet. – Prune

+0

@Prune Danke, ich habe die Frage als abgeschlossen markiert. – Hannan

Antwort

4

Statt einfach von candidate-False Einstellung, Behalte einen Zähler, wie viele Buchstaben verfehlt wurden. Wenn diese Anzahl die Anzahl der Leerzeichen im Rack überschreitet, dann disqualifizieren Sie das Wort. Bitte beachten Sie, dass if candidate == True redundant ist. Verwenden Sie einfach if candidate. Der Wert ist bereits Boolean; Es gibt keine Notwendigkeit, es zu testen.


-Code Änderungen pro hinzugefügt Versuch des OP:

Ihr Hauptproblem war der Enddruck innerhalb der Schleife aufweist; bis Sie alle Buchstaben überprüft haben (die Schleife beendet), wissen Sie nicht, ob das Wort möglich ist.

def valid_word(word, rack): 
    available_letters = rack[:] 
    blank_count = available_letters.count('_') 
    # print available_letters, blank_count 

    missed_counter = 0 
    for letter in word: 
     if letter in available_letters:   
      available_letters.remove(letter) 
     else: 
      missed_counter += 1 

    # print word, missed_counter 
    if missed_counter <= blank_count: 
     print(word) 


# Test program 
rack = ['_', 'u', 'v', 'w', 'x', 'y', 'z'] 
lexicon = ['apple', 'whisky', 'yutz', 'xray', 'tux', 'xyzzy', 'zebra'] 

for word in lexicon: 
    valid_word(word, rack) 

Ausgang:

yutz 
tux 
+0

Auch nur 'Rückkehr Kandidat' –

+0

Danke, ich habe versucht, zu tun, was Sie vorgeschlagen, bevor Sie es Stackoverflow setzen. Ich habe versucht, Reichweite (len (Wort)), um den Zähler zu machen. Aber leider konnte das gewünschte Ergebnis nicht erreicht werden. Ich bin ziemlich neu in der Programmierung von Python und hoffe, dass jemand meinen Code ändern kann. – Hannan

+0

Zeigen Sie uns, wo Sie mit diesem Versuch in Schwierigkeiten geraten sind? – Prune

1
In [1]: def valid_word(word, rack_list): 
...:  wrd = [w for w in word] 
...:  for l in rack_list: 
...:   try: 
...:    wrd.remove(l) 
...:   except: 
...:    pass 
...:  return len(wrd) <= ll.count('_') 
...: 
In [2]: valid_word('tux', ['_', 'u', 'v', 'w', 'x', 'y', 'z']) 
Out[2]: True 

In [3]: valid_word('apple', ['_', 'u', 'v', 'w', 'x', 'y', 'z']) 
Out[3]: False 
In [4]: valid_word('apple', ['_', 'u', 'v', 'w', 'x', 'y', 'l', 'z', '_', 'p', '_', 'p', 'e']) 
Out[4]: True 

sollte für Sie arbeiten

+0

Danke, das ist großartig. Ich habe die Frage auch mit etwas aktualisiert, das ich ausprobiert habe. – Hannan

+0

Lassen Sie mich Ihre Lösung versuchen. Danke – Hannan

1

Es gibt wahrscheinlich eine effizientere Lösung, aber diese funktionieren würde:

letters = ['_', 'u', 'v', 'w', 'x', 'y', 'z'] 

words = ['apple', 'whisky', 'yutz', 'xray', 'tux', 'zebra'] 

def valid_word(words, letters): 
    not_valid = [] 
    valid = [] 
    wild = 0 

    for letter in letters: 
     if letter == '_': 
      wild += 1 

    for word in words: 
     missing = 0 
     for letter in word: 
      if letter not in letters: 
       missing += 1 
       if missing > wild: 
        not_valid.append(word) 
        break 
     if word not in not_valid: 
      s = '' 
      for letter in word: 
       if letter in letters: 
        s += letter 
       else: 
        s += '_' 
      valid.append(s) 

    return valid 

print(valid_word(words, letters)) 

#output 
['yu_z', '_ux'] 

So erstellen Sie eine nicht gültige Liste, eine gültige Liste a nd eine wilde Variable, die die Anzahl der Unterstriche in Ihrer Briefliste zählt.

Dann durchlaufen Sie Ihre Wörter. Wenn die Anzahl der fehlenden Buchstaben des Worts größer ist als die Anzahl der Unterstriche, die von wild gezählt werden, fügen Sie das Wort zu Ihrer nicht gültigen Liste hinzu. Andernfalls fügen Sie ihm Ihre gültige Liste Buchstabe für Buchstabe hinzu und ersetzen fehlende Buchstaben durch einen Unterstrich.

Verwandte Themen