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

回答編集履歴

4

d

2019/04/19 05:30

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -60,4 +60,12 @@
60
60
  with open('data.csv', 'w') as f:
61
61
  writer = csv.writer(f, lineterminator='\n')
62
62
  writer.writerows(unique)
63
+ ```
64
+
65
+ ```output
66
+ 0.5,A
67
+ 0.4,B
68
+ 0.43,C
69
+ 0.151,D
70
+ 0.31,E
63
71
  ```

3

d

2019/04/19 05:30

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -38,7 +38,7 @@
38
38
  ```python
39
39
  import csv
40
40
  import itertools
41
- import operator
41
+ from operator import itemgetter
42
42
 
43
43
  lst = [[(0.10, 'A'), (0.111, 'B'), (0.143, 'C'), (0.151, 'D'), (0.131, 'E')],
44
44
  [(0.5, 'A'), (0.11, 'B'), (0.151, 'D'), (0.131, 'E')],
@@ -49,11 +49,11 @@
49
49
  # 1次元配列にする。
50
50
  flatten = list(itertools.chain(*lst))
51
51
  # タプルの2つ目の値でソートする。(itertools.groupby() はソート済みのリストに対してしか使えないため)
52
- flatten.sort(key=operator.itemgetter(1))
52
+ flatten.sort(key=itemgetter(1))
53
53
  # タプルのアルファベットでグルーピングする。
54
54
  unique = []
55
- for key, values in itertools.groupby(flatten, key=operator.itemgetter(1)):
55
+ for key, values in itertools.groupby(flatten, key=itemgetter(1)):
56
- unique.append(max(values, key=lambda x: x[0]))
56
+ unique.append(max(values, key=itemgetter(0)))
57
57
  print(unique) # [(0.5, 'A'), (0.4, 'B'), (0.43, 'C'), (0.151, 'D'), (0.31, 'E')]
58
58
 
59
59
  # CSV 形式で出力する。

2

2019/04/19 05:30

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -23,4 +23,41 @@
23
23
  with open('data.csv', 'w') as f:
24
24
  writer = csv.writer(f, lineterminator='\n')
25
25
  writer.writerows(unique)
26
+ ```
27
+
28
+ ## 追記
29
+
30
+ 1. 2次元配列なので、1次元配列にする。
31
+ [python - How to make a flat list out of list of lists - Stack Overflow](https://stackoverflow.com/questions/952914/how-to-make-a-flat-list-out-of-list-of-lists)
32
+ 2. タプルの2つ目のアルファベットでソートする。(3 の itertools.groupby() はソート済みのリストに対してしか使えないため)
33
+ [itertools — Python 3.7.3 ドキュメント](https://docs.python.org/ja/3/library/itertools.html#itertools.groupby)
34
+ 3. itertools.groupby() でタプルの2つ目のアルファベットでグループ化する。
35
+ 4. 同じグループ内でタプルの1つ目の値が最も大きい要素のみ残す。
36
+ 5. csv モジュールで csv 形式で出力する。
37
+
38
+ ```python
39
+ import csv
40
+ import itertools
41
+ import operator
42
+
43
+ lst = [[(0.10, 'A'), (0.111, 'B'), (0.143, 'C'), (0.151, 'D'), (0.131, 'E')],
44
+ [(0.5, 'A'), (0.11, 'B'), (0.151, 'D'), (0.131, 'E')],
45
+ [(0.10, 'A'), (0.4, 'B'), (0.167, 'C'), (0.1, 'D'), (0.31, 'E')],
46
+ [(0.156, 'B'), (0.43, 'C'), (0.151, 'D'), (0.13, 'E')]]
47
+
48
+
49
+ # 1次元配列にする。
50
+ flatten = list(itertools.chain(*lst))
51
+ # タプルの2つ目の値でソートする。(itertools.groupby() はソート済みのリストに対してしか使えないため)
52
+ flatten.sort(key=operator.itemgetter(1))
53
+ # タプルのアルファベットでグルーピングする。
54
+ unique = []
55
+ for key, values in itertools.groupby(flatten, key=operator.itemgetter(1)):
56
+ unique.append(max(values, key=lambda x: x[0]))
57
+ print(unique) # [(0.5, 'A'), (0.4, 'B'), (0.43, 'C'), (0.151, 'D'), (0.31, 'E')]
58
+
59
+ # CSV 形式で出力する。
60
+ with open('data.csv', 'w') as f:
61
+ writer = csv.writer(f, lineterminator='\n')
62
+ writer.writerows(unique)
26
63
  ```

1

d

2019/04/19 05:28

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -3,6 +3,7 @@
3
3
 
4
4
  2. set() をとることで、重複する要素を削除する。
5
5
 
6
+ 3. csv モジュールで csv 形式で出力する。
6
7
 
7
8
  ```python
8
9
  import csv