0

我还在学习用 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 ?
4

3 回答 3

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,则必须创建一个递归函数。

于 2013-02-20T04:36:58.720 回答
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)

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

于 2013-02-20T04:44:45.113 回答
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")

我同意这是更多的工作!

于 2013-02-20T04:50:17.350 回答