Wojciech
Wojciech

Reputation: 53

Selecting randomly from a list with a specific character

So, I have a text file (full of words) I put into a list. I want Python 2.7 to select a word from the list randomly, but for it to start in a specific character.

list code:

d=[]

with open("dic.txt", "r") as x:
    d=[line.strip() for line in x]

It's for a game called Shiritori. The user starts with saying any word in the English language, ie dog. The program then has to pick another word starting with the last character, in this case, 'g'.

code for the game:

game_user='-1'

game_user=raw_input("em, lets go with ")

a1=len(game_user)

I need a program that will randomly select a word beginning with that character.

Upvotes: 2

Views: 463

Answers (4)

TheoretiCAL
TheoretiCAL

Reputation: 20571

Because your game relies specifically upon a random word with a fixed starting letter, I suggest first sorting all your words into a dictionary with the starting letter as the key. Then, you can randomly lookup any word starting with a given letter:

d=[]
lookup = {}

with open("dic.txt", "r") as x:
    d=[line.strip() for line in x]

for word in d:
   if word[0] in lookup:
      lookup[word[0]].append(word)
   else:
      lookup[word[0]] = [ word ]

now you have a dict 'lookup' that has all your words sorted by letter. When you need a word that starts with the last letter of the previous word, you can randomly pick an element in your list:

import random
random_word = random.choice(lookup[ game_user[-1] ])

Upvotes: 3

Easton Bornemeier
Easton Bornemeier

Reputation: 1936

In order to get a new list of all the values that start with the last letter of the user input:

choices = [x in d if x[0] == game_user[-1]]

Then, you can select a word by:

newWord = random.choice(choices)

Upvotes: 2

boethius
boethius

Reputation: 438

You might get better use out of more advanced data structures, but here's a shot:

words_dict = {}
for row in d:
    # Gives us the first letter
    myletter = row[0]
    if myletter not in words_dict:
        words_dict[myletter] = []
    words_dict[myletter].append(row)

After creating a dictionary of all letters and their corresponding words, you can then access any particular set of words like so:

words_dict['a']

Which will give you all the words that start with a in a list. Then you can take:

# This could be any letter here..
someletter = 'a'
newword = words_dict[someletter][random.randint(0,len(words_dict[someletter]-1))]

Let me know if that makes sense?

Upvotes: 0

Meitham
Meitham

Reputation: 9670

>>> import random
>>> with open('/usr/share/dict/words') as f:
...     words = f.read().splitlines()
...
>>> c = 'a'
>>> random.choice([w for w in words if w.startswith(c)])
'anthologizing'

Obviously, you need to replace c = 'a' with raw_input("em, lets go with ")

Upvotes: 0

Related Questions