如何随机化if/elif语句的顺序?

2024-06-06 14:11:18 发布

您现在位置:Python中文网/ 问答频道 /正文

首先,一点背景知识,让你知道我想做什么。我正在创建一个可发音的单词生成器。为了使这些单词可以发音,只有某些字母可以跟在另一组字母后面。例如,单词不能以“dtb”开头。这很容易实现,只要一行if语句在单词中满足条件,就可以附加一个字母。但是,由于这是一个随机字生成器,所以我想随机化if/elif语句的执行顺序。我认为最好的方法是有一个函数列表(其中每个函数表示一个if语句或规则),对列表进行无序排列,然后迭代直到满足一个条件。这可以通过为每个规则显式定义如下函数来实现:

string = ''
def rule1():
    string += random_letter
    if string[0] in letter_set_A:
        string += random_from_letter_set_B
    return string

不过,我不希望这样做,因为最终会有十几个显式函数绑定到我不需要的名称上。我进一步研究了lambda以在列表中生成隐式函数,但它们不支持我上面使用的赋值。你知道吗

有没有可能创建一个类似于上述的复杂函数列表,这些函数可以以my_list[i]()格式调用,而无需显式定义它们?如果不是,我如何随机化If/elif语句的执行顺序?你知道吗


Tags: 函数列表stringif定义顺序规则字母
2条回答

假设有一个字典key:value,其中给定一个字符c作为键,您就有一个值,后面有一个允许字符的列表。
在这种情况下,你可以这样做

import random

allowed = {'a':['b'],'b':['c'],'c':['a']}

n_chars = 4

word = random.choice(list(allowed.keys()))

while len(word) < n_chars:
    word += random.choice(allowed[word[-1]])

同样的方法适用于以下更复杂的函数:

import random

def f1(): 
    return "a"
def f2(): 
    return "b"
def f3(): 
    return "c"  

allowed = {'a':[f1,f2],'b':[f2,f3],'c':[f3,f1]}

n_chars = 4

word = random.choice(list(allowed.keys()))

while len(word) < n_chars:
    word += random.choice(allowed[word[-1]])()

是的,你可以这样做。Python中的一切都是一个对象;您可以像拥有字典列表一样轻松地拥有函数列表。这就像

rule_table = [
    rule1, rule2, rule3,
    ...
]

然后您可以使用random.choice或其他方法来获取要调用的函数,就像您建议的那样。你知道吗

既然你有一套正式的规则,你可能会从阅读正式语法中得到更好的结构。有很多工具可用于将一组本地敏感的序列规则转换为各种可接受的字符串。您可能还想研究马尔可夫链,了解系统状态的概率变化。你知道吗

这够你忙一周吗?你知道吗

相关问题 更多 >