【问题标题】:Selecting randomly from a list with a specific character从具有特定字符的列表中随机选择
【发布时间】:2017-06-24 05:34:36
【问题描述】:

所以,我有一个文本文件(充满了文字),我把它放到了一个列表中。我希望 Python 2.7 从列表中随机选择一个单词,但要以特定字符开头。

列表代码:

d=[]

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

这是一款名为 Shiritori 的游戏。用户从说英语中的任何单词开始,即dog。然后程序必须选择另一个以最后一个字符开头的单词,在本例中为“g”。

游戏代码:

game_user='-1'

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

a1=len(game_user)

我需要一个程序来随机选择一个以该字符开头的单词。

【问题讨论】:

  • 你的代码在哪里?你有什么问题?

标签: python python-2.7


【解决方案1】:

因为您的游戏专门依赖于一个具有固定首字母的随机单词,所以我建议您首先将所有单词排序到一个字典中,并以首字母为关键字。然后,您可以随机查找以给定字母开头的任何单词:

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 ]

现在您有一个dict 'lookup' ,其中所有单词都按字母排序。 当您需要一个以前一个单词的最后一个字母开头的单词时,您可以在列表中随机选择一个元素:

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

【讨论】:

  • +1 因为这仅限于字典的访问时间,而不是每次播放新一轮时都需要生成一个新列表
【解决方案2】:

为了获得以用户输入的最后一个字母开头的所有值的新列表:

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

然后,您可以通过以下方式选择一个单词:

newWord = random.choice(choices)

【讨论】:

  • 如果你想获取单词而不是索引,你可能不想使用枚举。
【解决方案3】:
>>> 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'

显然,您需要将c = 'a' 替换为raw_input("em, lets go with ")

【讨论】:

    【解决方案4】:

    您可能会更好地利用更高级的数据结构,但这里有一个镜头:

    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)
    

    创建所有字母及其对应单词的字典后,您可以访问任何特定的单词集,如下所示:

    words_dict['a']
    

    这将为您提供列表中以 a 开头的所有单词。然后你可以采取:

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

    让我知道这是否有意义?

    【讨论】:

      猜你喜欢
      • 2019-06-06
      • 2011-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-19
      • 2016-06-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多