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)

これは、いくつかの可能な実装の1つであり、私が想像できる2つの最も素朴な実装の1つです。

于 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 に答える