Python:基于模式创建动态循环

时间:2013-02-20 04:32:03

标签: python

我还在学习用Python编写代码

我想基于模式生成一个字符串,我知道的唯一方法就是使用for循环。

在下面的示例代码中,我为“vcvcv”模式创建了一个循环。 c =辅音,v =元音

如何根据我提供给脚本的模式创建动态循环?

例如。如果pattern是“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 :(得分: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()就像一堆嵌套for循环。
  • ''.join(thing)将字符列表连接成一个字符串。

如果你想在没有itertools的情况下这样做,你必须做一个递归函数。

答案 1 :(得分:1)

如果您刚刚进入编程并希望看到比上面列出的迭代工具更通用的解决方案,那么递归是您最好的选择,允许您任意嵌套循环。

这里有一个轻微的复杂功能,您可以使用Python generators,或者使用更简单(但更简洁)的结构。后者的一个例子如下所示。

这样的东西
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)

这是几种可能的实现之一,也是我能想象的两种最天真的实现之一。

答案 2 :(得分: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")

我同意这是更多的工作!