user3212850
user3212850

Reputation: 61

Can Words in List1 be Spelled by Letters in List2

I'm new to coding and python, and I'm trying a version of the Scrabble Challenge at OpenHatch: https://openhatch.org/wiki/Scrabble_challenge.

The goal is to check whether each word in a list can be spelled by letters in a tile rack. I wrote a for-loop to check whether each letter in the word is in the tile rack, and if so, remove the letter from the rack (to deal with duplicates). However, I'm stumped on how to add a word to my valid_word list if the for-loop finds that each letter of the word is in the rack.

In this example, 'age' should be valid, but 'gag' should not be, as there is only one 'g' in the rack.

word_list = ['age', 'gag']
rack = 'page'
valid_words = []

for word in word_list:
    new_rack = rack
    for x in range(len(word)):
        if word[x] in new_rack:
            new_rack = new_rack.replace(str(word[x]), "")

Upvotes: 1

Views: 89

Answers (1)

Sukrit Kalra
Sukrit Kalra

Reputation: 34493

I would probably use a Counter here to simplify things. What the Counter class does is create a mapping of the items in an iterable to its frequency. I can use that to check whether the frequency of the individual characters is greater than those in the rack and print the word accordingly.

>>> from collections import Counter
>>> word_list = ['age', 'gag']
>>> rack = Counter('page')
>>> print rack
Counter({'a': 1, 'p': 1, 'e': 1, 'g': 1})
>>> for word in word_list:
        word_count = Counter(word)
        for key, val in word_count.iteritems():
            if rack[key] < val:
                break
        else:
            print word


age # Output.

Also, Counter has the nice property that it returns a 0 if the given key does not exist in the Counter class. So, we can skip the check to see whether the tile has the key, since rack[key] < val would fail in that case.

Upvotes: 2

Related Questions