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

2024-10-01 07:36:21 发布

您现在位置: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 ?

Tags: 方法字符串代码infor模式listpattern
3条回答

如果您刚开始编程,并且希望看到比上面列出的itertools更通用的解决方案,那么递归是您的最佳选择,允许您任意嵌套循环。在

这里有一个稍微复杂的地方,您可以使用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)

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

下面给出了前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")

我同意这是更多的工作!在

这样的方法应该有效:

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的情况下执行此操作,则必须创建一个递归函数。在

相关问题 更多 >