teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追記

2018/08/08 05:48

投稿

tachikoma
tachikoma

スコア3601

answer CHANGED
@@ -3,4 +3,75 @@
3
3
  > (0,0)にとんかつと含まれる文章。(0,1)にその文章をiとしたらi-1の文章。(0,2)にi+1,(0,3)にi-2...というように入れていきたいです。
4
4
 
5
5
  * 右側と左側どちらか先に見つかったら、探索を終了して次のとんかつに移動ですか?それとも右側だけですか?
6
- * 文章の端ではとんかつが見つからなくなる場合がありますが、その場合の終了条件はどうしますか?
6
+ * 文章の端ではとんかつが見つからなくなる場合がありますが、その場合の終了条件はどうしますか?
7
+
8
+ ----
9
+
10
+ ```Python
11
+ # テストデータ
12
+ samples = [
13
+ "とんかつ1",
14
+ "とんかつ2",
15
+ "a",
16
+ "b",
17
+ "c",
18
+ "d",
19
+ "e",
20
+ "f",
21
+ "g",
22
+ "h",
23
+ "i",
24
+ "j",
25
+ "k",
26
+ "l",
27
+ "とんかつ3",
28
+ ]
29
+
30
+ # 抽出コード
31
+ result = []
32
+ kw = "とんかつ"
33
+ MAX_REPEAT = 5
34
+ MIN_REPEAT = 2
35
+ for i, sample in enumerate(samples):
36
+ if kw in sample:
37
+ result.append([sample])
38
+
39
+ offset = 1
40
+ while True:
41
+ # マイナスのindexにならないようにする
42
+ if i - offset >= 0:
43
+ tmp = samples[i-offset]
44
+ else:
45
+ tmp = ""
46
+ result[-1].append(tmp)
47
+
48
+ # kwが含まれたら探索を終了する終了条件
49
+ if (any(kw in t for t in result[-1][1:])
50
+ and (offset >= MIN_REPEAT)
51
+ ):
52
+ break
53
+
54
+ # プラス側のインデックスは例外処理で対処
55
+ try:
56
+ tmp = samples[i+offset]
57
+ except IndexError:
58
+ tmp = ""
59
+ result[-1].append(tmp)
60
+
61
+ # kwが含まれたら探索を終了する終了条件
62
+ if (any(kw in t for t in result[-1][1:])
63
+ and (offset >= MIN_REPEAT)
64
+ ):
65
+ break
66
+
67
+ # 終了条件
68
+ if offset == MAX_REPEAT:
69
+ break
70
+
71
+ offset += 1
72
+
73
+ result
74
+ # [['とんかつ1', '', 'とんかつ2', ''],
75
+ # ['とんかつ2', 'とんかつ1', 'a', ''],
76
+ # ['とんかつ3', 'l', '', 'k', '', 'j', '', 'i', '', 'h', '']]
77
+ ```