回答編集履歴

4

c

2019/06/13 06:08

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -114,6 +114,10 @@
114
114
 
115
115
  """
116
116
 
117
+ # 列 lamp の区間と列 correct_time の区間のすべての組み合わせにおいて、
118
+
119
+ # 共通部分を計算し、その和集合をとる。
120
+
117
121
  overlaps = sy.EmptySet()
118
122
 
119
123
  for i1, i2 in itertools.product(row["lamp"], row["correct_time"]):

3

d

2019/06/13 06:08

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -114,45 +114,17 @@
114
114
 
115
115
  """
116
116
 
117
- overlaps = []
117
+ overlaps = sy.EmptySet()
118
118
 
119
119
  for i1, i2 in itertools.product(row["lamp"], row["correct_time"]):
120
120
 
121
- if not i1.is_disjoint(i2):
121
+ overlaps += i1 & i2
122
122
 
123
- # 区間 i1 と区間 i2 が共通部分を持つ場合は、overlaps に追加
123
+ # Union 場合は、Interval のリストとして返す。
124
124
 
125
- overlaps.append(i1 & i2)
125
+ # 区間が1つの場合でも Interval のリストとして返す。
126
126
 
127
-
128
-
129
- return simplify_intervals(overlaps)
127
+ return overlaps.args if isinstance(overlaps, sy.Union) else [overlaps]
130
-
131
-
132
-
133
-
134
-
135
- def simplify_intervals(intervals):
136
-
137
- """区間のリストを簡素化する。
138
-
139
- 例: [[200, 400), [400, 600)] -> [200, 600)
140
-
141
- """
142
-
143
- union = sum(intervals, sy.EmptySet())
144
-
145
- if isinstance(union, sy.Union):
146
-
147
- # Union の場合は、Interval のリストとして返す。
148
-
149
- return union.args
150
-
151
- else:
152
-
153
- # 区間が1つの場合でも Interval のリストとして返す。
154
-
155
- return [union]
156
128
 
157
129
 
158
130
 

2

d

2019/06/13 06:05

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -92,6 +92,22 @@
92
92
 
93
93
 
94
94
 
95
+ def intervals_to_str(intervals):
96
+
97
+ """sympy.Interval を文字列に戻す。
98
+
99
+ 例: [Interval.Ropen(111, 151), Interval.Ropen(412, 567)] -> "[(111 151) (412 567)]"
100
+
101
+ """
102
+
103
+ str_intervals = [f"({i.left} {i.right})" for i in intervals]
104
+
105
+ return "[" + " ".join(str_intervals) + "]"
106
+
107
+
108
+
109
+
110
+
95
111
  def calc_overlap(row):
96
112
 
97
113
  """列 lamp と列 correct_time の共通する区間のリストを返す。
@@ -142,22 +158,6 @@
142
158
 
143
159
 
144
160
 
145
- def interval_to_str(intervals):
146
-
147
- """sympy.Interval を文字列に戻す。
148
-
149
- 例: [Interval.Ropen(111, 151), Interval.Ropen(412, 567)] -> "[(111 151) (412 567)]"
150
-
151
- """
152
-
153
- str_intervals = [f"({i.left} {i.right})" for i in intervals]
154
-
155
- return "[" + " ".join(str_intervals) + "]"
156
-
157
-
158
-
159
- # csv ファイルを読み込む。
160
-
161
161
  df = pd.read_csv(
162
162
 
163
163
  "test.csv", converters={"lamp": str_to_intervals, "correct_time": str_to_intervals}
@@ -170,7 +170,7 @@
170
170
 
171
171
  # sympy.Interval を文字列表現に戻す。
172
172
 
173
- df = df.applymap(interval_to_str)
173
+ df = df.applymap(intervals_to_str)
174
174
 
175
175
  # csv ファイルとして保存する。
176
176
 

1

d

2019/06/13 05:58

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -22,9 +22,9 @@
22
22
 
23
23
 
24
24
 
25
- 1. pandas の read_csv() で csv ファイルを読み込む。
25
+ * 1. pandas の read_csv() で csv ファイルを読み込む。
26
-
26
+
27
- 2. 文字列をタプルのリストに変換する。
27
+ * 2. 文字列をタプルのリストに変換する。
28
28
 
29
29
  ```
30
30
 
@@ -32,11 +32,11 @@
32
32
 
33
33
  ```
34
34
 
35
- 3. タプルのリストを sympy.Interval のリストに変換する。
35
+ * 3. タプルのリストを sympy.Interval のリストに変換する。
36
-
36
+
37
- 4. 列 lamp と列 correct_time の共通する区間のリストを計算する。(集合の積)
37
+ * 4. 列 lamp と列 correct_time の共通する区間のリストを計算する。(集合の積)
38
-
38
+
39
- 5. sympy.Interval のリストを文字列に戻す。
39
+ * 5. sympy.Interval のリストを文字列に戻す。
40
40
 
41
41
 
42
42