回答編集履歴

2

追記

2018/04/03 23:39

投稿

hayataka2049
hayataka2049

スコア30933

test CHANGED
@@ -51,3 +51,37 @@
51
51
  ['tera-tail', 'Tera-tail', 'tEra-tail', 'TEra-tail', 'tera-Tail', 'Tera-Tail', 'tEra-Tail', 'TEra-Tail']
52
52
 
53
53
  ```
54
+
55
+
56
+
57
+ ### 更に追記
58
+
59
+ 上のコードがなんだかすっきりしていなかったので、見た目が綺麗な処理方法を考えました。
60
+
61
+ ```python
62
+
63
+ >>> string = "tera-tail"
64
+
65
+ >>> lst = ["t", "e"]
66
+
67
+ >>> result = [""]
68
+
69
+ >>> for c in string:
70
+
71
+ ... if c in lst:
72
+
73
+ ... result = [s+c for s in result] + [s+(c.upper())for s in result]
74
+
75
+ ... else:
76
+
77
+ ... result = [s+c for s in result]
78
+
79
+ ...
80
+
81
+ >>> print(result)
82
+
83
+ ['tera-tail', 'Tera-tail', 'tEra-tail', 'TEra-tail', 'tera-Tail', 'Tera-Tail', 'tEra-Tail', 'TEra-Tail']
84
+
85
+ ```
86
+
87
+ 性能面で課題があるかもしれません。

1

追記

2018/04/03 23:38

投稿

hayataka2049
hayataka2049

スコア30933

test CHANGED
@@ -13,3 +13,41 @@
13
13
  ```
14
14
 
15
15
  こんな感じでどうでしょう。
16
+
17
+
18
+
19
+ ### 追記
20
+
21
+ 質問文のコードを見直して、もしかして可能な変換をすべて列挙したかったのかと気づきました。
22
+
23
+ 書き方は色々あると思いますが、一例を示しておきます。素直に書いたつもりですが、あまりすっきりはしていないかもしれません。
24
+
25
+ ```python
26
+
27
+ >>> string = "tera-tail"
28
+
29
+ >>> lst = ["t", "e"]
30
+
31
+ >>> char_pos = [i for i, c in enumerate(string) if c in lst]
32
+
33
+ >>> def int_to_bool(num, base):
34
+
35
+ return [bool(num & (1<<n)) for n in range(base)]
36
+
37
+ ...
38
+
39
+ >>> result = []
40
+
41
+ >>> for i in range(2**len(char_pos)):
42
+
43
+ ... bool_lst = int_to_bool(i, len(char_pos))
44
+
45
+ ... result.append(("".join([(c.upper() if bool_lst.pop(0) else c) if i in char_pos else c for i, c in enumerate(string)])))
46
+
47
+ ...
48
+
49
+ >>> print(result)
50
+
51
+ ['tera-tail', 'Tera-tail', 'tEra-tail', 'TEra-tail', 'tera-Tail', 'Tera-Tail', 'tEra-Tail', 'TEra-Tail']
52
+
53
+ ```