python 如何比较列表中的值和字符串?

mzaanser  于 2023-01-16  发布在  Python
关注(0)|答案(2)|浏览(218)

我想创建一个脚本,应该防止相同的句子。首先,我认为这是足够的,只是检查如果前一个句子和当前句子是相同的。但结果是,没有句子应该是重复的。我的第一个想法是创建一个新的列表,并保存在它创建的句子。之后,程序应该检查新的句子是否在列表中。但是它根本不起作用,我不知道为什么。我希望你能帮助我。

  • 如果你发现任何语法错误,这是因为我把脚本翻译成英语,做了一个错误。
import random

sentence = ''
previous_sentence = ''
sentence_list = []

def create_sentence():
    names = ["x","y", "z"]
    descriptions = ["a","b", "Dc"]
    global sentence
    global previous_sentence
    global sentence_list


    while sentence == previous_sentence:
        sentence_list.append(sentence)
        name = random.choice(names)
        description = random.choice(descriptions)
        sentence = f'{name} is a {description}'
        if sentence == previous_sentence and sentence in sentence_list:
            name = random.choice(names)
            description = random.choice(descriptions)
            sentence = f'{name} is a {description}'
        else:
            previous_sentence = sentence
            return sentence
    else:
        prevoius_sentence = sentence
        return sentence       

for i in range(50):
    print(create_sentence())
7jmck4yq

7jmck4yq1#

您提供的脚本看起来应该可以防止生成重复的句子,但是它存在一些问题,可能会导致它无法按预期工作。
首先,在while循环中,在检查句子是否重复之前,先将句子添加到sentence_list中,所以即使它是重复的,也会被添加到列表中,这意味着后面的重复检查将无法正常工作。
接下来,在while循环中,你有一个if-else块,如果当前句子是重复的,你可以在这里用一个新句子重新赋值语句变量,但是,这个块应该在while循环中,以便在每次生成一个重复的句子时执行。
此外,您使用相同的变量名来检查重复的句子和句子列表,这可能会导致混淆。
下面是脚本的修订版本,应该可以正常工作:

import random

previous_sentence = ''
sentence_list = set()

def create_sentence():
    names = ["x","y", "z"]
    descriptions = ["a","b", "Dc"]
    global previous_sentence
    global sentence_list

    sentence = f'{random.choice(names)} is a {random.choice(descriptions)}'
    while sentence in sentence_list:
        sentence = f'{random.choice(names)} is a {random.choice(descriptions)}'
    sentence_list.add(sentence)
    previous_sentence = sentence
    return sentence

for i in range(50):
    print(create_sentence())
qxgroojn

qxgroojn2#

我用一种更简洁的方式重写了代码,不使用全局变量,使代码更可重用:

import random

def create_sentence(names, descriptions, sentence_list):
    name = random.choice(names)
    description = random.choice(descriptions)
    sentence = f'{name} is a {description}'
    while sentence in sentence_list:
        name = random.choice(names)
        description = random.choice(descriptions)
        sentence = f'{name} is a {description}'
    sentence_list.append(sentence)
    return sentence

def main():
    names = ["x","y", "z"]
    descriptions = ["a","b", "Dc"]
    sentence_list = []

    for i in range(50):
        print(create_sentence(names, descriptions, sentence_list))

if __name__ == '__main__':
    main()
  • create_sentence()函数使用while循环继续生成新句子,直到生成sentence_list中尚未包含的句子。生成唯一句子后,将使用sentence_list.append(sentence)行将其添加到sentence_list中。
  • 该函数还通过在将新句子添加到列表之前检查该句子是否已经在列表中来确保创建新句子,直到它与前一个句子不同为止。这确保了列表将只包含唯一的句子。
  • 函数create_sentence()从程序的主逻辑中分离出来,使其更易于重用和测试。
  • 该函数接受namesdescriptionssentence_list作为参数,使函数依赖的数据更加清晰。
  • 该函数使用while循环而不是全局变量来跟踪上一句。
  • main函数创建变量并在for循环中调用create_sentence函数。
  • main函数 Package 在if name == 'main'块中,它允许代码作为模块导入,而无需运行main函数。
  • 变量名和函数名都是lower_case_with_underlines,这使得它更易读、更一致。
  • 代码可读性更强,更容易理解。
  • 删除了if else块,因为它不是必需的。

相关问题