- コード求むID: 422
- 登録日時: 2009/02/23 12:03
- 最終更新日時: 2009/02/24 22:30
- アクセス数: 746
- タグ:
今Pythonを勉強しています。
Pythonを始めたばかりなので、小さく単純なものをいくつか書いて練習しています。で、今トライしているのが、「stringを1つ受け取り、そのstringを考えられる全ての大文字と小文字の組み合わせのリストを作り表示する」というものです。
例:
['ab',
"abc"
['abc',
というリストを作成し、表示する。
という単機能な関数を作りたいのですが、どのようにしたら良いかわからず困っています。
まだPythonを勉強し始めたばかりなので、string
recursionかnested
コメント

- 2:koichi
- 2009/02/23 21:02
動作はPython
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 ]

- 4:ゲスト (BLUEPIXY)
- 2009/02/23 23:16
#大文字化する文字の位置をビットと対応させて実行する
def

- 5:ゲスト
- 2009/02/24 00:54
質問投稿者です。
Koichiさん。
まさにこの様なコードを書こうとして、うまくいかず悪戦苦闘してました。
処理の流れは理解した気でいますが、実際は恐らく理解したつもりでいるだけだと思うので、似たようなのを他にも試してみて、理解を深めたいと思います。
ありがとうございました。
BLUEPIXYさん。
これは全く考えつきませんでした。
PythonというよりCのようですが、このようなコードも書けるのですね。
c
ありがとうございました。
両者とも違ったアプローチを紹介してくださり、大変参考になりました。
本当にどうもありがとうございました。

- 6:mikeda
- 2009/02/24 18:34
高度でカッコよさげなコードですね!!!
初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つの文字列を使う必要はないと思うのですがとりあえず。
- 8:mikeda
- 2009/02/24 22:16
配列を返す・・・
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")
愚直すぎですね。もうちょっとすっきりとー
- 9:mikeda
- 2009/02/24 22:30
こっちのがいいかな
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")
連投すみません。さぐりさぐりなもんで・・・
前へ 1 次へ![]()







質問を投稿した者です。
質問を投稿する時に回線が切れてしまったので、最初の投稿はされていないものと勘違いし、二つ続けての投稿となってしまいました。すみませんでした。
もし回答をしてくださる人がいれば、こちらの方にお願いします。