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

时间:2018-08-28 22:40:06

标签: python function lambda

首先,请提供一些背景知识,以便您了解我要做什么。我正在创建一个发音明显的单词生成器。为了使单词可发音,只有某些字母集可以跟随另一组字母的成员。例如,单词不能以“ 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语句的执行顺序?

2 个答案:

答案 0 :(得分:3)

假设有一个字典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]])()

答案 1 :(得分:2)

是的,您可以这样做。 Python中的一切都是对象。您可以像列出字典一样轻松地获得函数列表。就像

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

然后,您可以按照建议使用random.choice或其他方法来调用函数。

由于您拥有一套正式的规则,因此阅读有关正式语法的信息可能会得到更好的结构。有很多工具可以将一组本地敏感的序列规则转换为各种可接受的字符串。您可能还需要研究马尔可夫链,以了解系统状态的概率变化。

足够让您整周忙碌吗?