我可能在标题中奇怪地解释了它,但这是我的问题。我正在制作一个小句子生成程序并选择句子,它选择一个随机句子结构。
我希望在不同的行上有一个包含不同结构代码的文件,如下所示:
random.choice(blankThat)+" "+sentenceSubject+" "+random.choice(description)+"."
random.choice(questionBegin)+" "+sentenceSubject+" "+random.choice(pastDescription)+"?"
random.choice(pastBegin)+" "+sentenceSubject+" "+random.choice(pastDescription)+"."
random.choice(subjectBegin)+" "+sentenceSubject+"."
random.choice(subjectQuestion)+" "+sentenceSubject+"?"
sentenceSubject+" "+random.choice(description)+"."
sentenceSubject+" "+random.choice(pastDescription)+"."
random.choice(subjectBeginExclaim)+" "+sentenceSubject+"!"
random.choice(songList)+" "+random.choice(["is","was"])+" "+random.choice(adverbs)+" "+random.choice(adjectives)+"."
sentenceSubject+" "+"is"+" "+random.choice(describers)+"."
我如何随机选择执行上述代码行之一?我尝试使用这个简单的代码随机选择一个......
templateFile = open("structures.txt","a+")
templates = templateFile.readlines()
templates = [y.strip() for y in templates]
finalSentence = random.choice(templates)
但是当我print(finalSentence)
时,它只是吐出一条线而不是执行它:
random.choice(pastBegin)+" "+sentenceSubject+" "+random.choice(pastDescription)+"."
如何随机选择并执行其中一行?如果我能从文件中读取结构,我会更喜欢它,因为我会定期添加新的句子结构。
答案 0 :(得分:3)
这里有你能做什么的草图。看起来您的文件的每一行都使用三种类型的表达式:
" is "
,sentenceSubject
和random.choice(blankThat)
。创建可识别这些表达式的迷你语言。 E.g:
?blankThat " " !sentenceSubject " " ?description "."
创建所有常量字符串的字典,例如:
strings = {"sentenceSubject" : "Hello, world", ...}
创建所有字符串集合的字典,例如:
collections = {"blankThat" : ["foo", "bar", ...],
"description" : ["dog", "cat", ...], ...}
编写一个迷你解析器,它接受用迷你语言编写的字符串,将其分解为表达式,通过令牌的第一个字符确定每个表达式的类型,并将其转换为正确的字符串:
collections
中找到X,调用random.choice(collections[X])
strings[X]
最后,结合所有翻译件。希望它有所帮助。
答案 1 :(得分:2)
这不是您问题的直接答案,但我认为这可能会有所帮助。考虑构建和生成此信息的不同方法。这是一个简单而不完美的例子,但我认为这可能是一个很好的起点:
import random
subject = "Jeremy"
descriptions = ["cool", "tall", "strong"]
hobbies = ["running", "coding"]
def sentence_maker3000():
sentence_vals = {"subject": subject, "descriptions": random.choice(descriptions), "hobbies": random.choice(hobbies)}
valid_sentences = ["{subject} is {descriptions}", "{subject} likes {hobbies}"]
sentence = random.choice(valid_sentences).format(**sentence_vals)
return sentence
print(sentence_maker3000()) # Might print "Jeremy is cool" or "Jeremy likes coding"
您可以使用Python的格式括号构建所有有效句子。非常容易阅读,写得更短。
您可以将这些有效句子写在单独的文本文件中,如下所示:
{subject} is {descriptions}
{subject} likes {hobbies}
然后将valid_sentences
作业替换为:
with open('input.txt', 'r') as f:
valid_sentences = f.read().splitlines()
答案 2 :(得分:0)
使用
print(eval(finalSentence))
而不是print(finalSentence)
。 eval(str)
所做的是它需要一个字符串并像运行普通代码一样运行它。