【问题标题】:Need help fixing a random sentence generator that uses for loops and list's需要帮助修复使用 for 循环和列表的随机句子生成器
【发布时间】:2017-08-18 17:56:19
【问题描述】:

我正在尝试编写一个程序,该程序将形成随机句子,这些句子可以重复传递给 for 循环,以通过使用 random.choice()、变量和列表每次生成不同的输出。一个示例如下所示:

list_0 = ["string1", "string2", "string3", "string4"]
variable_0 = random.choice(list_0)

list_1 = ["string1", "string2", "string3", "string4"]
variable_1 = random.choice(list_1)

list_2 = ["string1", "string2", "string3", "string4"]
variable_2 = random.choice(list_2)

在我形成主语、连词、名词、动词等的列表后,然后我将它们传递给与所述列表中的一个随机选择等效的变量。此时有几种方法可以打印句子,想法是程序将从每个列表中选择一个随机单词并按 _0 _1 和 _2 的顺序打印出来,因此句子将是随机的但符合语法。 我已经尝试列出所有变量并像这样随机化这些变量

list_3 = [list_0, list_1, list_2]
random.choice(list_3)

但是这一次只会打印一个选项,而且我需要整个随机句子,所以我尝试了

list_3 =  [list_0 + list_1 + list_2]

虽然这确实打印了整个随机句子,但一旦它进入 for 循环,它只会在停止之前打印一次,我认为这是因为它没有被告知要多次评估,例如:

for line in list_3:
    try:
        print(line)
        if line !='\n':
            #do function
            sleep(10)
        else:
            pass
    except:
            #do function
            sleep(2) 

即使使用 sleep 函数,脚本也会在 1 次迭代后停止,所以我在顶部尝试了一个“while True”循环,虽然这迫使该函数多次打印,但输出是重复的,而不是另一个随机句子。示例:

while True:    
    for line in list_3:
      try:
        print(line)
        if line !='\n':
            do function
            sleep(10)
        else:
            pass
      except:
            #do function
            sleep(2)

这是我卡住的地方,从我可以看到随机函数只将一个随机句子传递给我的 for 循环,所以当 while 循环再次运行 for 循环时,它只会打印前一个句子。对于每次新的迭代,我能做些什么来为我的 for 循环传递一个与前一个不同的句子吗?我很乐意帮助我还是个新手。

【问题讨论】:

  • 因为 list_3 只包含 1 个元素,random.choice() 永远不会返回超过 1 个结果。

标签: python


【解决方案1】:

用注释或删除的while循环外顶部的代码试试这个

while True:  
    list_0 = ["string1", "string2", "string3", "string4",]
    variable_0 = random.choice(list)

    list_1 = ["string1", "string2", "string3", "string4",]
    variable_1 = random.choice(list)

    list_2 = ["string1", "string2", "string3", "string4",]
    variable_2 = random.choice(list)
    list_3 =  [list_0 + list_1 + list_2]
    for line in list_3:
      try:
        print(line)
        if line !='\n':
            do function
            sleep(10)
        else:
            pass
      except:
            #do function
            sleep(2)

【讨论】:

  • 所以我应该将我的整个代码包装在一个while循环中?我想我有点困惑
【解决方案2】:

这是一个简洁的版本:

import random

words = [["Two","Three", "Four"],
         ["red","yellow","green"],
         ["cats","dogs","zebras"],
         ["jumped.", "danced.", "wrote poetry."]]

for i in range(5):
    print( ' '.join([random.choice(w) for w in words]))

典型输出:

Three yellow cats jumped.
Three yellow zebras jumped.
Four red zebras jumped.
Two green zebras danced.
Four green dogs wrote poetry.

请注意如何直接创建列表列表,而无需将内部列表分配给变量。

理解代码的关键是理解列表理解

[random.choice(w) for w in words]

这本质上是类似以下内容的语法糖:

sentence = []
for w in words:
    sentence.append(random.choice(w))

最后,使用' '.join() 是获取单词列表并将它们连接在一起的好方法。

【讨论】:

  • 非常感谢,这确实简化了事情,我的代码让我非常头疼!
猜你喜欢
  • 2015-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多