如何用Python中孤立的元音替换字符串中的字母

如何用Python中孤立的元音替换字符串中的字母,python,python-3.x,string,shuffle,Python,Python 3.x,String,Shuffle,我正在创建一个函数 将输入作为字符串 返回一个字符串 返回字符串的字数与输入字符串相同,字母与输入字符串相同,但单个单词的长度可能不同。i、 e perm_lets("try this") == "ist thry" 是有效的返回值。字符串X中的“字数”是指列表X.split(“”)的长度,即比字符串中的空格数多一个。“单词”是指没有空格的一串字母。最后, 每个元音都必须是孤立的,即在元音旁边最多有空格和/或辅音 我的函数只能洗牌输入字符串的字母。我想知道如何分离元音 import

我正在创建一个函数

  • 将输入作为字符串
  • 返回一个字符串
  • 返回字符串的字数与输入字符串相同,字母与输入字符串相同,但单个单词的长度可能不同。i、 e

    perm_lets("try this") == "ist thry"
    
  • 是有效的返回值。字符串
    X
    中的“字数”是指列表
    X.split(“”)
    的长度,即比字符串中的空格数多一个。“单词”是指没有空格的一串字母。最后,

  • 每个元音都必须是孤立的,即在元音旁边最多有空格和/或辅音
  • 我的函数只能洗牌输入字符串的字母。我想知道如何分离元音

        import random as rd
        def perm_lets(input_string):
            nS = ''.join(rd.sample(input_string,len(input_string)))
            print(nS)
    

    我希望perm_lets(“这是一个循环”)的输出类似于“siolopit ahs”,但实际输出是“ph siioos lt”(错误位置的空格和元音没有被隔离)。

    这里有一种方法可以尝试你想要的。将元音与辅音分开,将它们随机排列,将元音与辅音分开,但分离元音的尝试很差(但如果元音多于辅音,这将失败),随机选择字长,确保每个字至少一个字符,且输出字数与输入字数相同

    必要时,通过生成更多的单元音单词,可能可以更好地隔离元音。然而,根据元音与辅音的比率和单词的数量,总会有一些情况下,您无法同时分离元音和输出所需的单词数量

    from itertools import chain, zip_longest
    from random import randint, random, shuffle
    
    s = 'this is a loop'
    
    vowels = []
    consonants = []
    for char in s.replace(' ', ''):
        if char in 'aeiouAEIOU':
            vowels.append(char)
        else:
            consonants.append(char)
    
    shuffle(vowels)
    shuffle(consonants)
    if len(vowels) > len(consonants) or random() > 0.5:
        a, b = vowels, consonants
    else:
        a, b = consonants, vowels
    
    letters = ''.join([c for c in chain.from_iterable(zip_longest(a, b)) if c])
    words = []
    for i in range(s.count(' '), -1, -1):
        x = randint(1, len(letters) - i)
        words.append(letters[:x])
        letters = letters[x:]
    
    s = ' '.join(words)
    print(s)
    # EXAMPLE RANDOM OUTPUT:
    # si hipa lo tos
    

    带有不合格测试的蛮力随机化:

    import re
    import random
    import time
    
    def perm_lets(s):
        s = list(s)
        start = time.perf_counter()
        while True:
            random.shuffle(s)
            p = ''.join(s)
            if '  ' in p: continue                            # no spaces together
            if p.startswith(' ') or p.endswith(' '): continue # don't start or end with space
            if re.search(r'[aeiou]{2}',p): continue           # no vowels together
            elapsed = time.perf_counter() - start
            return p,elapsed
    
    print(perm_lets('this is a loop'))
    print(perm_lets('i bid you adieu'))
    
    输出(4次运行):


    注意:“再见,路易”没有解决办法。

    你也可以这样做

    • 使用正则表达式分离元音和辅音
    • 将每个元音组合成辅音
    • 洗牌结果,直到结果不以空格开始/结束,并且没有两个空格在一起
    随机导入
    进口稀土
    def perm_lets(st):
    ls=re.findall(r“([aeiouAEIOU])|()”,st)
    vs,cs=[c代表c,如果len(c)>0则在ls中,[v代表,如果len(v)>0则在ls中]
    位置=列表(范围(镜头(cs)))
    result=“”
    对于vs中的v:
    如果len(位置)==0:
    cs.追加(“+v”)
    其他:
    p=随机选择(位置)
    位置。移除(p)
    cs[p//2]+=v
    尽管如此:
    随机。随机(cs)
    结果=“加入(cs)
    如果不是(结果中的result.startswith(“”)或result.endswith(“”)或“”):
    打破
    返回结果
    打印(perm_lets(“这是一个循环”))
    打印(perm_lets(“teis iou”)#元音多于辅音
    
    输出

    tp so hal osii
    si u tei o
    
    

    这是限制排列的情况吗?@MarkTolonen的答案是在给定约束条件下处理随机性的更好方法(并且在失败之前将处理更高的元音与辅音比率)。
    tp so hal osii
    si u tei o