代码之家  ›  专栏  ›  技术社区  ›  shantanuo

使用排列生成单词

  •  -1
  • shantanuo  · 技术社区  · 2 年前

    我正在尝试在替换dict中找到的字符后生成单词。如果给定x字符串。。。

    x = 'sap'
    

    返回可能的单词,如。。。

    x_result = ['sap', 'saq', 'sbp', 'sbq']
    

    替换表为:

    replacements = {'a':'b', 'b':'a', 'm':'n', 'n':'m', 'p':'q', 'q':'p'}
    

    下面是另一个例子:

    y = 'map'
    y_result = ['map', 'maq', 'mbp', 'mbq', 'nap', 'naq', 'nbp', 'nbq']
    
    1 回复  |  直到 2 年前
        1
  •  3
  •   Joran Beasley    2 年前

    我会通过首先确定字符串中每个位置的选项来解决这个问题

    x = "sap"
    replacements = {"a":"b","b":"a","m":"n","n":"m","p":"q","q":"p"}
    # use a set to eliminate duplicates...
    subs = [{_x,replacements.get(_x,_x)} for _x in x]
    print(subs) # [{'s'}, {'a', 'b'}, {'p', 'q'}]
    

    这基本上说

    • 位置0的选项仅为“s”
    • 位置1的选项为“a”或“b”
    • 位置2的选项为“p”或“q”

    然后您可以简单地使用内置的itertools来获得这些列表的乘积

    import itertools
    print(["".join(s) for s in itertools.product(*subs)])
    #['sbp', 'sbq', 'sap', 'saq']
    
    
        2
  •  2
  •   Kelly Bundy    2 年前

    仔细阅读单词,应用每个字母的替换词(如果有的话):

    x_result = [x]
    for i, c in enumerate(x):
        if d := replacements.get(c):
            x_result += [w[:i] + d + w[i+1:] for w in x_result]
    

    Attempt This Online!