質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1340閲覧

二次元配列内にタプルをもつ配列のデータハンドリング方法

sequelanonymous

総合スコア123

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/04/19 04:38

以下のアウトプット1を降順にし、重複を排除してアウトプット2のようなデータの持ち方をしてcsvに書き込みたいと思っています。色々、試行錯誤していますが、中々うまいこといきません。何か、お気づきの点ありましたらご教示いただけませんでしょうか?

アウトプット1

python

1type(lists) 2<class 'list'> 3print(lists) 4 5[[(0.10, 'A'), (0.111, 'B'), (0.143, 'C'), (0.151, 'D'), (0.131, 'E')], 6[(0.5, 'A'), (0.11, 'B'), (0.151, 'D'), (0.131, 'E')], 7[(0.10, 'A'), (0.4, 'B'), (0.167, 'C'), (0.1, 'D'), (0.31, 'E')], 8[(0.156, 'B'), (0.43, 'C'), (0.151, 'D'), (0.13, 'E')]] 9 10import csv 11with open('data.csv', 'w') as file: 12 writer = csv.writer(file, lineterminator='\n') 13 writer.writerows(lists)

アウトプット2

[[0.5, 'A'], [0.4, 'B'], [0.1.., 'C'], ...]

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

  1. 2次元配列なので、1次元配列にする。

python - How to make a flat list out of list of lists - Stack Overflow

  1. set() をとることで、重複する要素を削除する。

  2. csv モジュールで csv 形式で出力する。

python

1import csv 2import itertools 3 4lst = [[(0.10, 'A'), (0.111, 'B'), (0.143, 'C'), (0.151, 'D'), (0.131, 'E')], 5 [(0.5, 'A'), (0.11, 'B'), (0.151, 'D'), (0.131, 'E')], 6 [(0.10, 'A'), (0.4, 'B'), (0.167, 'C'), (0.1, 'D'), (0.31, 'E')], 7 [(0.156, 'B'), (0.43, 'C'), (0.151, 'D'), (0.13, 'E')]] 8 9 10# 1次元配列にする。 11flatten = list(itertools.chain(*lst)) 12# list -> set とすることで、重複を削除する。 13unique = set(flatten) 14# CSV 形式で出力する。 15with open('data.csv', 'w') as f: 16 writer = csv.writer(f, lineterminator='\n') 17 writer.writerows(unique)

追記

  1. 2次元配列なので、1次元配列にする。

python - How to make a flat list out of list of lists - Stack Overflow
2. タプルの2つ目のアルファベットでソートする。(3 の itertools.groupby() はソート済みのリストに対してしか使えないため)
itertools — Python 3.7.3 ドキュメント
3. itertools.groupby() でタプルの2つ目のアルファベットでグループ化する。
4. 同じグループ内でタプルの1つ目の値が最も大きい要素のみ残す。
5. csv モジュールで csv 形式で出力する。

python

1import csv 2import itertools 3from operator import itemgetter 4 5lst = [[(0.10, 'A'), (0.111, 'B'), (0.143, 'C'), (0.151, 'D'), (0.131, 'E')], 6 [(0.5, 'A'), (0.11, 'B'), (0.151, 'D'), (0.131, 'E')], 7 [(0.10, 'A'), (0.4, 'B'), (0.167, 'C'), (0.1, 'D'), (0.31, 'E')], 8 [(0.156, 'B'), (0.43, 'C'), (0.151, 'D'), (0.13, 'E')]] 9 10 11# 1次元配列にする。 12flatten = list(itertools.chain(*lst)) 13# タプルの2つ目の値でソートする。(itertools.groupby() はソート済みのリストに対してしか使えないため) 14flatten.sort(key=itemgetter(1)) 15# タプルのアルファベットでグルーピングする。 16unique = [] 17for key, values in itertools.groupby(flatten, key=itemgetter(1)): 18 unique.append(max(values, key=itemgetter(0))) 19print(unique) # [(0.5, 'A'), (0.4, 'B'), (0.43, 'C'), (0.151, 'D'), (0.31, 'E')] 20 21# CSV 形式で出力する。 22with open('data.csv', 'w') as f: 23 writer = csv.writer(f, lineterminator='\n') 24 writer.writerows(unique)

output

10.5,A 20.4,B 30.43,C 40.151,D 50.31,E

投稿2019/04/19 04:49

編集2019/04/19 05:30
tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sequelanonymous

2019/04/19 05:03

ありがとうございます、ここで特に悩んでいたのが、stringのデータが重複した場合、一番数値が大きいデータを残し、降順にソートするという処理をしたくて、何かお気づき頂いたことがあればご教示頂けると助かります。 例えば、(0.10, 'A'), (0.11, 'A'), (0.5, 'A')の場合、(0.10, 'A'), (0.11, 'A'),を削除して(0.5, 'A')を残したいです。
tiitoi

2019/04/19 05:28 編集

追記しました。もし、意図と違ったら教えてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問