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

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

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

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

PyCharm

エディター・開発ツール

Q&A

解決済

2回答

2383閲覧

同率一位を表示するには

meroy25

総合スコア13

Python

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

PyCharm

エディター・開発ツール

0グッド

0クリップ

投稿2017/10/02 05:00

当方Pycharmの初心者です。

このプログラムはある人気投票の結果が記録されたファイル(1行につき得票者の名前が一つ記録されている)を読み込み、最も得票数が多い人の名前とその得票数を出力するものです。この場合、得票数が最も多い人は一人しかいないものとなっています。

そこで、下記のソースコードを一部変えて得票数1位の人が複数存在してもその全員の名前、得票数を表示できるようなプログラ厶を作成したいと考えています。

しかし、複数存在する同率1位の得票者の名前全てを読み込む方法がどうしても分からず、書き換えに苦戦しています。

どなたか教えていただけると幸いです。よろしくお願い致します。

f = open("votes.txt") votes = {} max = 0 for name in f: name = name[:-1] votes[name] = votes.get(name, 0) + 1 if max < votes[name]: max = votes[name] who = name f.close() print('{0:s} {1:d}票'.format(who, max))

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

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

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

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

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

guest

回答2

0

ベストアンサー

まず、maxというビルトイン関数があるので、それを上書きするのは良くないと思います。別の変数名を使いましょう。

最大得票者を計算するのは、最後にいっきにやったほうが楽だと思います。

lang

1votes = {} 2 3with open("votes.txt") as f: 4 for name in f: 5 name = name[:-1] 6 votes[name] = votes.get(name, 0) + 1 7 8max_votes = max(votes.values()) 9tops = [name for name, v in votes.items() if v == max_votes] 10 11 12print(f'{" ".join(tops)} {max_votes}票')

votesdict(辞書型)なのでvotes.values()でvalue全体のリストのようなものを取得できます。maxでその最大値max_votesを計算し、その最大得票数をもつ候補者の名前のリストをtopsとしています。

投稿2017/10/02 05:34

karamarimo

総合スコア2551

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

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

0

  • とにかく全員の得票数を辞書に登録。
  • 辞書を値の降順にソートした結果から、値が最大値の要素のみを抽出

すればよいかと思います。

Python

1d = {'A':10, 'B':5, 'C':10, 'D':2, 'E':5} 2 3v_max = max(d.values()) 4for k, v in sorted(d.items(), key=lambda x:x[1],reverse=True): 5 if v < v_max: 6 break 7 print(k,v) 8 9# A 10 10# C 10

別解

ファイル走査中に、最大得票数の決定と、候補者リストを作成する例です。
接戦だとリスト生成が多数回発生しますが、先の回答よりは処理時間は短くなるはずです。

Python

1f = open("votes.txt") 2votes = {} 3who = [] 4max_v = -1 5for name in f: 6 name = name[:-1] 7 votes[name] = votes.get(name, 0) + 1 8 if max_v < votes[name]: 9 max_v = votes[name] 10 who.clear() # これまでの候補をクリア 11 12 if max_v == votes[name]: 13 who.append(name) 14 15f.close() 16print('{0:s} {1:d}票'.format(str(who), max_v))

投稿2017/10/02 05:14

編集2017/10/02 06:10
can110

総合スコア38262

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

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

karamarimo

2017/10/02 05:45

候補者数が多いなら、ソートするとなると少なくともO(nlogn)の計算が必要になるので、ちょっと効率が悪いんじゃないかと思います。最大得票数の計算と、それを持つ候補者の抽出はO(n)でできるので。
can110

2017/10/02 05:49

ご指摘のとおりです。実際はソートする必要はなくデータ数が増えると効率悪いですね。 karamarimoさんの回答のほうが、時間もかからずリスト内包表記ですっきりとしていて良いと思います。
meroy25

2017/10/02 06:07

ありがとうございます!参考にさせていただきました。
can110

2017/10/02 06:13

とりあえず別解も考えてみました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問