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

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

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

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

Q&A

解決済

株式会社ゆめみさんの採用コーディング試験模試のコードレビューをお願い致します。

sdfguu6u
sdfguu6u

総合スコア5

Python 3.x

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

1回答

0グッド

1クリップ

448閲覧

投稿2022/12/05 00:58

https://www.yumemi.co.jp/serverside_recruit
上記はゆめみさんの採用コーディング試験の模試をpythonで実装しました。

以下コードです。

import csv import collections source_file = open('output.txt', 'w') def get_total_score(csv_reader): player_to_ttlscore = {} for row in csv_reader: if row[1] not in player_to_ttlscore.keys(): player_to_ttlscore[row[1]] = {} player_to_ttlscore[row[1]]['cnt'] = 1 player_to_ttlscore[row[1]]['total'] = int(row[2]) else: player_to_ttlscore[row[1]]['cnt'] += 1 player_to_ttlscore[row[1]]['total'] += int(row[2]) return player_to_ttlscore def get_avg_score(player_to_ttlscore): avgscore_to_players = {} for player in player_to_ttlscore: avg_score = int(player_to_ttlscore[player]['total'] / player_to_ttlscore[player]['cnt']) if avg_score not in avgscore_to_players.keys(): avgscore_to_players[avg_score] = [player] else: avgscore_to_players[avg_score].append(player) ## 平均値の降順にする return collections.OrderedDict(sorted(avgscore_to_players.items(), reverse=True)) def output_ranking(ordered_ranking): rank = 1 for avg_score, player_with_samescore in ordered_ranking.items(): # ランキング10で終了 if rank > 10: break ## 同じスコアの人がいないとき if len(player_with_samescore) == 1: print("{},{},{}".format(rank, str(player_with_samescore)[2:-2], avg_score), file=source_file) rank += 1 else: for j in range(len(player_with_samescore)): print("{},{},{}".format(rank, player_with_samescore[j], avg_score), file=source_file) ## 同スコアの数だけ人数分ランクの数を増やす rank += len(player_with_samescore) with open('dummy1.txt') as csv_file: csv_file.readline() csv_reader = csv.reader(csv_file, delimiter=',') player_to_ttlscore = get_total_score(csv_reader) ordered_ranking = get_avg_score(player_to_ttlscore) output_ranking(ordered_ranking)

ダミーデータです

create_timestamp,player_id,score 2021/01/02 13:00,player0002,10000 2021/01/06 13:00,player0002,5000 2021/01/06 13:00,player0003,2000 2021/01/06 13:00,player0003,5000 2021/01/06 13:00,player0005,5300 2021/06/19 22:06,player3430,6000

https://qiita.com/taruhachi/items/0318c1a603478058d863
こちらの評価基準のほうに

通常プログラムはそのプログラム単体では利用されず、入力されるデータも他のプログラムにより生成されることが多いが、そのデータが急に変更されたときなどに破壊的な問題を起こさないか

とあるのですが、私のコードはこれを満たしていますでしょうか?

また、こちらの上記のコードに例外処理をいれるとすれば、どのようにすればよいでしょうか?

オブジェクト指向での実装をこれから行うつもりなのですが、
コーディング試験の採点側からすると、OOPでの実装はやはりプラスの評価なのでしょうか?

どれか一つで構いませんのでアドバイスいただけますと幸いです。
よろしくお願いいたします

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

2022/12/05 04:49

こちらの質問が複数のユーザーから「広告と受け取られるような質問」という指摘を受けました。

2022/12/05 07:36

こちらの質問が複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という指摘を受けました。

javahack

2022/12/05 04:56

正確なところは出題者にしかわかりません。 出題者に聞きましょう。
68user

2022/12/05 05:12

書いてあるとおり、何を重視したのかアピールコメントに書きましょう。個人的にはコードの良し悪しよりコメントの方が10倍大事と思います。 破壊的云々とあるので、カラム数・日時・数値チェックを入れればよいのではというのもありますが、ランキングという性質からすると異常時に終了すべきか異常データとしてスキップすべきかは要検討でしょう。あと何百万件などと大量データになるかもしれないスコア情報集計をメモリに溜め込むのはどうかなと思いますが「可読性重視で1行ずつオブジェクトに格納しました」と書いてあるならまあよしかなと。
68user

2022/12/05 05:16

失礼。全行メモリに溜め込んでるかと勘違いしておりましたがそうではありませんでした。
sdfguu6u

2022/12/05 06:30 編集

回答ありがとうございます。 >破壊的云々とあるので、カラム数・日時・数値チェックを入れればよいのではというのもありますが、ランキングという性質からすると異常時に終了すべきか異常データとしてスキップすべきかは要検討でしょう。 こちらの意味が私にはうまく理解で来ませんでした。 異常データとしてスキップとは具体的にどういう意味なのでしょうか。 例外として処理するということなのでしょうか。 お手数おかけしますがよろしくお願いいたします
68user

2022/12/06 11:13

端的にいえば異常データが見つかったら即終了するのか、あるいはスキップして処理を続行するのかということです。正解はないのでなぜそうしたかを書けばよいと思います。
sdfguu6u

2022/12/17 02:02

なるほど参考になりました。 意図をかくことが大切なのですね。 ありがとうございました。

回答1

0

ベストアンサー

私のコードはこれを満たしていますでしょうか?

満たしているかどうかはゆめみさんが評価することですが、少なくとも

python

1source_file = open('output.txt', 'w')

と記述した時点で output.txt が存在する場合は内容を消してしまうので、ファイルを読み込む前にシステムにとっては破壊的な変更をしていることになります。
また、source という単語は入力(データの元)を指すことが多いです。出力先に source という単語を使うとかなり混乱します。

あとせめて入出力のルールくらいはちゃんと満たしましょう。
実行時にコマンドライン引数でファイル名を指定しているところとか、標準出力に結果を出力しているところとか、ヘッダー行がないところとか。

などなど、いろいろとコメントは可能ではあるのですが、できれば自分で考えてみてください。

投稿2022/12/05 08:07

mather

総合スコア6735

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

mather

2022/12/05 08:13

なお、これ以上のコードレビューはお断りいたしますし、「上記のコードに例外処理をいれるとすれば、どのようにすればよいでしょうか?」は質問ではなくコード作成依頼なので論外です。自分で書いてみてから質問してください。
sdfguu6u

2022/12/17 02:03

レビューいただきありがとうございました。

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Python 3.x

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