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

回答編集履歴

4

追記

2020/12/17 23:08

投稿

jeanbiego
jeanbiego

スコア3966

answer CHANGED
@@ -10,20 +10,20 @@
10
10
  import csv
11
11
 
12
12
  def renumber(IDs, data):
13
- for k in IDs:
13
+ for k in IDs: # IDsからkey(登録済みID)を一つずつ呼び出し
14
- diff = [abs(int(v)-int(d)) for v, d in zip(IDs[k], data[2:])]
14
+ diff = [abs(int(v)-int(d)) for v, d in zip(IDs[k], data[2:])] # 登録済みのID内容と、判定対象のID内容の各数値の差分の絶対値をとってリストに格納
15
- if max(diff) <= 5:
15
+ if max(diff) <= 5: # 差分の最大値が5以内であれば
16
- return [k] + data[1:]
16
+ return [k] + data[1:] # ID名を登録済みの番号に変えて値を返す
17
- return data
17
+ return data # 登録済みIDと重複がないと判定されたら、何も変更せずに返す
18
18
 
19
- IDs = dict()
19
+ IDs = dict() # 今までに出てきたIDをkey, それに付随する数値をvalueにして格納するため
20
20
  with open('out.csv', 'r', encoding='UTF-8') as f:
21
- reader = csv.reader(f)
21
+ reader = csv.reader(f) # 読み込み用のインスタンス生成
22
22
  with open('inp.txt','w', encoding='UTF-8', newline="") as i:
23
- writer = csv.writer(i)
23
+ writer = csv.writer(i) # 書き込み用のインスタンス生成
24
- for data in reader:
24
+ for data in reader: # 一行ずつ読み込み(csvなので、カンマで区切られたリスト型)
25
- if "ID:" in data[0]:
25
+ if "ID:" in data[0]: # 一要素目がID番号なら
26
- data = renumber(IDs, data)
26
+ data = renumber(IDs, data) # renumber関数で±5以内の重複判定
27
- IDs[data[0]] = data[2:]
27
+ IDs[data[0]] = data[2:] # IDsに登録(同じIDがあれば上書きしてしまうので、もしかしたら要件と違う挙動かもしれない)
28
28
  writer.writerow(data)
29
29
  ```

3

修正

2020/12/17 23:08

投稿

jeanbiego
jeanbiego

スコア3966

answer CHANGED
@@ -3,7 +3,7 @@
3
3
  IDsリストに最初に出てきたID内容を保存して、renumber関数で保存内容と比較して必要なら書き換えてます。
4
4
 
5
5
  ※修正しました
6
- renumberの中のif文、continueになっていましたが、これだと「どれか一つでも差が5以内なら同ID」という処理した。
6
+ renumberが「どれか一つでも差が5以内なら同ID」という処理になっていました。
7
7
  diffというリストに差分を格納して、最大が5を超えていないか確認するよう修正したことで「どれか一つでも差が5以上なら異ID」になっていると思います。
8
8
  ```python3
9
9
  import pandas as pd

2

コード修正

2020/12/15 23:46

投稿

jeanbiego
jeanbiego

スコア3966

answer CHANGED
@@ -2,15 +2,17 @@
2
2
  ファイルは標準ライブラリのcsvモジュールであけてます。
3
3
  IDsリストに最初に出てきたID内容を保存して、renumber関数で保存内容と比較して必要なら書き換えてます。
4
4
 
5
+ ※修正しました
6
+ renumberの中のif文が、continueになっていましたが、これだと「どれか一つでも差が5以内なら同ID」という処理でした。
7
+ diffというリストに差分を格納して、最大が5を超えていないか確認するよう修正したことで「どれか一つでも差が5以上なら異ID」になっていると思います。
5
8
  ```python3
6
9
  import pandas as pd
7
10
  import csv
8
11
 
9
12
  def renumber(IDs, data):
10
13
  for k in IDs:
11
- for v, d in zip(IDs[k], data[2:]):
14
+ diff = [abs(int(v)-int(d)) for v, d in zip(IDs[k], data[2:])]
12
- if abs(int(v)-int(d)) > 5:
15
+ if max(diff) <= 5:
13
- continue
14
16
  return [k] + data[1:]
15
17
  return data
16
18
 
@@ -24,25 +26,4 @@
24
26
  data = renumber(IDs, data)
25
27
  IDs[data[0]] = data[2:]
26
28
  writer.writerow(data)
27
-
28
- # inp.txt
29
- # Frame #: 1,,,,,
30
- # Frame_time:0.03,,,,,
31
- # Frame #: 2,,,,,
32
- # Frame_time:0.07,,,,,
33
- # Frame #: 3,,,,,
34
- # ID:1,KPHN,866,800,965,850
35
- # ID:2,KPHN,796,850,851,904
36
- # Frame_time:0.10,,,,,
37
- # Frame #: 4,,,,,
38
- # ID:1,KPHN,866,800,967,851
39
- # ID:2,KPHN,796,852,851,906
40
- # Frame_time:0.13,,,,,
41
- # Frame #: 5,,,,,
42
- # ID:1,KPHN,873,799,976,851
43
- # ID:2,KPHN,796,852,853,909
44
- # Frame_time:0.17,,,,,
45
- # Frame #: 6,,,,,
46
- # ID:1,KPHN,875,799,979,853
47
- # ID:2,KPHN,796,853,855,911
48
29
  ```

1

修正

2020/12/15 23:44

投稿

jeanbiego
jeanbiego

スコア3966

answer CHANGED
@@ -23,7 +23,6 @@
23
23
  if "ID:" in data[0]:
24
24
  data = renumber(IDs, data)
25
25
  IDs[data[0]] = data[2:]
26
- print(data)
27
26
  writer.writerow(data)
28
27
 
29
28
  # inp.txt