Python:根据模式创建动态循环
我还在学习用Python编程。
我想根据一个模式生成字符串,我知道的唯一方法就是用for循环。
在下面的示例代码中,我为“vcvcv”这个模式创建了一个循环。这里的c代表辅音,v代表元音。
我想知道如何根据我提供给脚本的模式来创建一个动态的循环。
比如,如果模式是“cvcvc”,那么循环应该构建成能生成这个字符串。
希望能得到帮助。
谢谢。
#!/bin/env python
vowel="aeiou"
consonant="bcdfghjklmnpqrstvwxyz"
lvowel=list(vowel)
lconsonant=list(consonant)
# pattern for "vcvcv" = ababa
for a in lvowel:
for b in lconsonant:
for c in lvowel:
for d in lconsonant:
for e in lvowel:
myname=a+b+c+d+e
print myname
# pattern for "cvcvc" = babab
# how to make the loop dynamic based on pattern ?
3 个回答
0
下面是一个稍微复杂一点但容易自定义的版本,用来生成前n个排列。
def gen_pattern( seq, op = "" ):
vowel="aeiou"
consonant="bcdfghjklmnpqrstvwxyz"
lvowel=list(vowel)
lconsonant=list(consonant)
if ( not seq ):
print op
return
if ( seq[0] == 'v' ):
for v in lvowel:
gen_pattern( seq[1:], op+v )
elif ( seq[0] == 'c' ):
for c in lconsonant:
gen_pattern( seq[1:],op+c )
if __name__ == "__main__":
gen_pattern("vcvcv")
我同意,这确实需要更多的工作!
1
如果你刚开始接触编程,想找一个比上面提到的itertools更通用的解决方案,那么递归是个不错的选择,它可以让你随意嵌套循环。
这里有一点小复杂的地方,你可以使用Python生成器来处理,或者使用一些更简单(但可能会显得有点乱)的写法。下面是后者的一个例子。
像这样的代码:
def continuePattern(pat, strSoFar):
if pat == '':
print strSoFar
elif pat[0] == 'v':
for c in lvowel:
continuePattern(pat[1:], strSoFar + c)
elif pat[0] == 'c':
for c in lconsonant:
continuePattern(pat[1:], strSoFar + c)
这是几种可能的实现方式之一,也是我能想到的两种最简单的方式之一。
5
像这样应该可以实现:
import itertools
mapping = {
'v': 'aeiou',
'c': 'bcdfghjklmnpqrstvwxyz'
}
pattern = 'vcvcv'
for thing in itertools.product(*map(mapping.get, pattern)):
print ''.join(thing)
大致上,它是这样工作的:
map(mapping.get, pattern)
这个部分把'vcv'
转换成['aeiou', 'bcdfghjklmnpqrstvwxyz', 'aeiou']
。也就是说,它把每个字母替换成对应的字符列表。*map(...)
这个符号的作用是把参数列表展开。itertools.product()
就像是一堆嵌套的循环。''.join(thing)
这个方法把字符列表合并成一个完整的字符串。
如果你想不使用 itertools
来实现这个功能,你就需要写一个递归函数。