这是卡塔的挑战。该函数应在字符串中返回最大数量的后续元音。
我自己完成此程序后,发现了这个非常实用的解决方案。
有人可以逐步解释代码吗?我想在这里彻底理解联接位和拆分位是如何相互完成的。
def solve(string):
return max(map(len, ''.join(i if i in 'aeiou' else ' ' for i in string).split()))
Run Code Online (Sandbox Code Playgroud)
在这些情况下,最好的做法是简化并分成较小的部分。在join简单地接合在一起或者通过一个元音或从条件发生器理解的空的空间构成字符串的序列:
s = 'aei234roieeieigfh'
out1 = ''.join(i if i in 'aeiou' else ' ' for i in s)
# 'aei oieeiei '
Run Code Online (Sandbox Code Playgroud)
以上只是编写以下生成器函数的一种好方法:
def f(s):
for i in s:
if i in 'aeiou':
yield i
else:
yield ' '
''.join(f(s))
# 'aei oieeiei '
Run Code Online (Sandbox Code Playgroud)
然后通过拆分,您将获得一个字符串列表,如下所示:
out2 = out1.split()
# ['aei', 'oieeiei']
Run Code Online (Sandbox Code Playgroud)
然后通过与进行映射len,就可以获取len列表中的每一项:
list(map(len, out2))
# [3, 7]
Run Code Online (Sandbox Code Playgroud)
与执行操作相同:
[len(i) for i in out2]
# [3, 7]
Run Code Online (Sandbox Code Playgroud)
最后,通过选择,max您将在列表中找到最长的元音序列。
我个人会选择itertools.groupby这里:)
max(len(list(v)) for k,v in groupby(s, key=lambda x: x in 'aeiou') if k)
# 7
Run Code Online (Sandbox Code Playgroud)
一些读物可能会有用: