前提・実現したいこと
Python3で、特定の文字に該当する文字列の大文字変換をするプログラムを書いています。
一応動くものになっていますが、条件に該当する文字が増えるほど、条件が増えていってしまうような記述方法になっているので、スッキリしたコードがあればご助言いただきたいです。
現状、一致する文字数が4個までのプログラムになっているので、n個でも対応できるようなプログラムにしたいです。
(追記)
hayataka2049さんの仰る通り変換できうるパターンを全て列挙したいです。
該当のソースコード
Python
1#例 2string = "tera-tail" 3rule = "te" 4 5i = 0 6sol1 = [] 7sol1.append(string.lower()) 8positions = [] 9characters = [] 10 11#1文字だけ順に小文字から大文字に変換 12for s in list(string.lower()): 13 sol2 = '' 14 if s in rule.lower(): 15 string2 = list(string.lower()) 16 s = s.upper() 17 string2[i] = s 18 for s2 in string2: 19 sol2 += s2 20 sol1.append(sol2) 21 #変換した文字の位置番号と文字をリスト化して後述で使用 22 positions.append(i) 23 characters.append(s) 24 i = i + 1 25 26import itertools 27permu = [] 28permu_list = [] 29#リスト化した位置番号と文字を1つのリストにまとめる 30for p,c in zip(positions,characters): 31 permu = [[p,c]] 32 permu_list.extend(permu) 33 34#ruleに合致する文字が2個の組み合わせ処理 35if len(positions) > 2: 36 for p1,p2 in list(itertools.combinations(permu_list,2)): 37 sol2 = '' 38 string2 = list(string.lower()) 39 string2[p1[0]] = p1[1] 40 string2[p2[0]] = p2[1] 41 for s2 in string2: 42 sol2 += s2 43 sol1.append(sol2) 44 45#ruleに合致する文字が3個の組み合わせ処理 46if len(positions) > 3: 47 for p1,p2,p3 in list(itertools.combinations(permu_list,3)): 48 sol2 = '' 49 string2 = list(string.lower()) 50 string2[p1[0]] = p1[1] 51 string2[p2[0]] = p2[1] 52 string2[p3[0]] = p3[1] 53 for s2 in string2: 54 sol2 += s2 55 sol1.append(sol2) 56 57#ruleに合致する文字全て大文字に変換 58for p,c in zip(positions,characters): 59 string2[p] = c 60sol2 = '' 61for s2 in string2: 62 sol2 += s2 63sol1.append(sol2) 64 65print(sol1) 66#['tera-tail', 'Tera-tail', 'tEra-tail', 'tera-Tail', 'TEra-tail', 'Tera-Tail', 'tEra-Tail', 'TEra-Tail'] 67

回答5件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/04/04 02:57