【问题标题】:How to randomize order of if/elif statements?如何随机化 if/elif 语句的顺序?
【发布时间】:2018-08-28 22:40:06
【问题描述】:

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

但是我宁愿不这样做,因为我最终会得到十几个与我不需要的名称相关的显式函数。我进一步研究了 lambdas 以在列表中创建隐式函数,但它们不支持我上面使用的赋值。

是否有可能创建一个像上面这样的复杂函数列表,可以以my_list[i]() 的格式调用而无需明确定义它们?如果没有,如何随机化 if/elif 语句的执行顺序?

【问题讨论】:

    标签: python function lambda


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      这足以让你忙碌一周吗?

      【讨论】:

        猜你喜欢
        • 2015-01-16
        • 2022-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多