大文字と小文字の全ての組み合わせを表示したいのですが・・・
ゲスト
ゲスト
ATOMRSS
  • コード求むID: 422
  • 登録日時:  2009/02/23 12:03
  • 最終更新日時: 2009/02/24 22:30
  • アクセス数: 746
  • タグ: 
  • codeなにがしブックマークに追加する 0 users
  • このページを del.icio.us に追加
  • このページをはてなブックマークに追加

今Pythonを勉強しています。
Pythonを始めたばかりなので、小さく単純なものをいくつか書いて練習しています。で、今トライしているのが、「stringを1つ受け取り、そのstringを考えられる全ての大文字と小文字の組み合わせのリストを作り表示する」というものです。

例:
 "ab"をパラメータとして受け取った場合、
['ab', 'Ab', 'aB', 'AB']
 
"abc" をパラメータとして受け取った場合、
['abc', 'Abc', 'aBc', 'abC', 'ABc', 'AbC', 'aBC', 'ABC']

というリストを作成し、表示する。
という単機能な関数を作りたいのですが、どのようにしたら良いかわからず困っています。

まだPythonを勉強し始めたばかりなので、string functions等、あまり明るくありません。map()やreduce()等を使ってうまくできないかと考えたのですが、良いアイデアが思いつきません。また、maketrans()というものもあるらしいのですが、これまたうまい使い方が思いつきません。(別にbuilt-in functionを絶対に使うぞ、と決めた訳ではありません。使った方が簡単にできるかな?と思っただけです)。

recursionかnested loopを用いればできるはず、と思って考えているのですがどうにもうまくいかず困ってます。どなたか知恵をお借りできたら嬉しいです。よろしくお願いします。

コメント

  • ゲスト
  • 1:ゲスト
  • 2009/02/23 16:00

質問を投稿した者です。
質問を投稿する時に回線が切れてしまったので、最初の投稿はされていないものと勘違いし、二つ続けての投稿となってしまいました。すみませんでした。

もし回答をしてくださる人がいれば、こちらの方にお願いします。

GJGJ

動作はPython 3.0で確認しました(2.xでも動くはず)。
PythonistaはLisp風のmap()よりHaskell風のリスト内包表記を好むらしいです。

def str_allcases(str):
    if str == '': return [str]
    
    head, rest = str[0], str[1:]
    lc, uc = head.lower(), head.upper()
    if lc == uc:
        heads = (lc)
    else:
        heads = (lc, uc)
    rests = str_allcases(rest)
    return [ head + rest for head in heads for rest in rests ]

GJGJ

すいません、一行間違ってました(なんで動くんだろう?)。

        heads = (lc)

        heads = (lc,)
の間違いです。

GJGJ

  • ゲスト
  • 4:ゲスト (BLUEPIXY)
  • 2009/02/23 23:16

#大文字化する文字の位置をビットと対応させて実行する
def comb(str):
    len(str)
    ** l
    ls=[]
    for in range(c):
        x=""
        bit c
        for in range(l):
            bit >>= 1
            += str[i].upper() if bit else str[i]
        ls.append(x)
    print(ls) return ls

GJGJ

  • ゲスト
  • 5:ゲスト
  • 2009/02/24 00:54

質問投稿者です。

Koichiさん。
まさにこの様なコードを書こうとして、うまくいかず悪戦苦闘してました。
処理の流れは理解した気でいますが、実際は恐らく理解したつもりでいるだけだと思うので、似たようなのを他にも試してみて、理解を深めたいと思います。
ありがとうございました。

BLUEPIXYさん。
これは全く考えつきませんでした。
PythonというよりCのようですが、このようなコードも書けるのですね。
2**lで2のl乗となるんですね。stringやtupleなどを複数回繰り返して何に使えるんだろう?とPythonの文法を勉強しながら思っていましたが、こういう使い方もできるんですね。大変参考になりました。
ありがとうございました。

両者とも違ったアプローチを紹介してくださり、大変参考になりました。
本当にどうもありがとうございました。

GJGJ

高度でカッコよさげなコードですね!!!
初Pythonの自分ががんばって書いてみるとこんな感じでしょうか。

def func(s, i=0, a=""):
  if len(s) == i:
    print a
    return

  func(s, i+1, a + s[i].lower())
  func(s, i+1, a + s[i].upper())

func("abc")
sとaと、2つの文字列を使う必要はないと思うのですがとりあえず。

GJGJ

あ、すみません、表示じゃなくて配列作成でしたね・・・

GJGJ

配列を返す・・・

def func(s, a=""):
  if len(s) == len(a): return [a]

  return func(s, a + s[len(a)].lower()) + func(s, a + s[len(a)].upper())

print func("abc")
def func(s,i=0):
  if len(s) == i: return [s]

  return func(s[0:i]+s[i].lower()+s[i+1:],i+1) + func(s[0:i]+s[i].upper()+s[i+1:],i+1)

print func("abc")
愚直すぎですね。もうちょっとすっきりとー

GJGJ

こっちのがいいかな

def func(s, i=0):
  if len(s) == i: return [s]

  return func(s[0:i]+s[i:].lower(), i+1) + func(s[0:i]+s[i:].upper(), i+1)

print func("abc")
連投すみません。さぐりさぐりなもんで・・・

GJGJGJ

前へ 1 次へ

プレゼン公開・共有サイト handsOut.jp チーム・マイナス6% - みんなで止めよう温暖化

ブックマークコメント