teratail header banner
teratail header banner
質問するログイン新規登録
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

1579閲覧

配列/dict型/クラスの使い分け方

Frankie

総合スコア6

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2022/12/22 14:20

0

0

前提

pythonを新たに始めた初心者。
pythonで文章を解析して、文ごとのキーワードのリストを作り、似たキーワードセットを持つ文を取り出したいと考えています。
実装上の問題はないのですが、配列/dict型/classの使い分けが分かりません。
データ構造だけの話なので、学生ごとの定期テスト/小テストの各科目点数で例に挙げます。

実現したいこと

日付ごとの全生徒点数表から、一つの構造体が、
[生徒001,
[[2022/01, [定期, 数学. 英語, 国語], [小テスト, 数学. 英語, 国語], ...]
[2022/02, [定期, 数学. 英語, 国語], [小テスト, 数学. 英語, 国語], ...]
... ],
[[2022/01, [定期, 前回比較数学. 英語, ], [小テスト, 前回比較数学. 英語, ], ...]
... ],
[[2022/01, [定期, 平均差数学. 英語, ], [小テスト, 平均差数学. 英語, ], ...]
... ]]
[生徒002,
... ]
と各生徒毎の点数表に直したものを作りたい。前回比較や平均との差は実際の点数から簡単な処理で一意に求められるもの。
後からの利用は点数や前回との比較が条件に合うものを抽出するという形になります。

発生している問題・エラーメッセージ

データ構造体を何で実装したらいいかが分かりません。
配列がいいのか、dict型, classがいいのか。
数値処理(実際は形態素解析して動詞を見出し, 名詞をその他要素にする処理)は別に関数の形でmainの外に出しました。
非常に大規模ならSQLが必要かと思いますが(未勉強), 今は一気に処理する想定です。
何も考えずに配列を使い始めましたが、見出しだけあるdict型(生徒で抽出することはあっても、日付で抽出することは殆どなさそう, データテーブルに移しやすい?)、class(処理をclass内に実装できる, 隠蔽する利点はほぼない, 各要素にpropertyを名付けられる)といったものを使った方がいいのか、用途ごとの使い分け方が分かりません。

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

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

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

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

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

guest

回答1

0

ベストアンサー

リストと辞書の違いは、位置に名前が付いているかいないかです。

text

1[2022/01, [定期, 数学. 英語, 国語], [小テスト, 数学. 英語, 国語], ...]

このデータはリストですが、位置に意味が付いています。 0番目は年度、 1番目は定期テスト、 さらに中の配列は、0ば番目が種別で、1番目が数学です。
辞書にすると、たとえば、

text

1{'年度': '2022/01', '定期', {'数学': xxx, '英語': xxx, '国語': xxx}, '小テスト':{'数学':xxx, '英語': xxx, '国語': xxx} ...}

のようなデータになります。

両者を比較したとき、コードの可読性はどうかというと、list_data[0][0][1] よりも dict_data['2022/01']['定期']['英語']の 方がわかりやすいですよね。

また、データが追加になったらどうでしょう。定期テストが年2回になったとき、リストだと2番目に追加したくなりますが、そうすると、参照しているところがすべて造りなおしですね。
通常の辞書では並びが不定になりますが、名前が付いていれば特に問題にはならないでしょう。

クラスにするのはどうかという話はパラダイムの違いなので、好きなほうにすればいいと思いますが、pythonには、リストや辞書には便利なメソッドや対応した関数がたくさんあるので、データ処理という観点では、あまりクラスの利点は無いように思います。

また、データを処理するのであれば、pandasなどのデータ処理モジュールを使うのもありでしょう。
標準偏差などの統計的なデータ処理の機能が入っているので、慣れると手軽に処理できるようになります。

投稿2022/12/22 14:46

TakaiY

総合スコア14542

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

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

Frankie

2022/12/22 14:58

ありがとうございます。辞書では要素も名前が付くのを分かっていませんでした。 またpandasはstring型も含めて要素検索がしやすそうなので、こちらの方がいいように思われました。使ってみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問