Python:根据模式创建动态循环

0 投票
3 回答
594 浏览
提问于 2025-04-17 16:27

我还在学习用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 来实现这个功能,你就需要写一个递归函数。

撰写回答