如何用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
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