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

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

ただいまの
回答率

90.75%

  • Python 3.x

    5293questions

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

Python3 リスト内にある整数の出現回数を数える方法 最大

解決済

回答 6

投稿

  • 評価
  • クリップ 1
  • VIEW 177

N個ある整数が半角スペース区切りで与えられます。

・1 行目に、整数 N が与えられます。
・2 行目に、N 個の整数が半角スペース区切りで与えられます。
・2行目の整数の中で、一番多く出現する整数を出力してください。
・一番多く出現する整数が が複数ある場合は昇順に全て出力して下さい。

入力例1
5
1 1 2 2 3

出力例1
1 2

入力例2
5
1 2 3 1 1

出力例2
1

私のコード)

コード

N = int(input())

data = list(map(int,input().split()))

#それぞれの整数と出現回数をリストに2重リストにまとめる
lst = []
for x in data:
    row = []
    count = data.count(x)
    row.append(x)
    row.append(count)
    lst.append(row)   
print(lst)

#出力値
[[1, 2], [1, 2], [2, 2], [2, 2], [3, 1]] 

出現回数の最大値を求める
その条件にある整数を出力
繰り返し処理のため、一度出力した整数が何度も出てしまう。

k,v = zip(*lst)
for x in range(N):
    if lst[x][1] == max(v):
        print(lst[x][0], end=' ')

出力値 
1 1 2 2 

期待値
1 2 

質問

出現回数の最大値の整数が
繰り返し処理のため、一度出力したものが何度も出てしまう。
どのように改善したらいいのか教えて頂きたいです。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 6

checkベストアンサー

+3

「それぞれの整数と出現回数をリストに2重リストにまとめる」の段階で重複をなくしておくのがベターで、setを使います。

for x in set(data):
    row = []
    count = data.count(x)
    row.append(x)
    row.append(count)
    lst.append(row)   


でも実際問題として、この形で処理するのはしんどいので、私なら辞書を使って書きます。書いてみたけど、ちょっと汚いかも。

from collections import defaultdict
from itertools import takewhile

N = int(input())

data = list(map(int,input().split()))

d = defaultdict(int)
for x in data:
    d[x] += 1

lst = sorted(d.items(), key=lambda x:x[1], reverse=True)

v0 = lst[0][1]

print(" ".join([str(k) for k,v in sorted(takewhile(lambda x: x[1]==v0, lst),
                                         key=lambda x:x[0])]))

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/21 12:31

    何度も書いて練習していたらようやく理解できました!!
    便利な機能ばかりで、感動しました!

    とにかく毎日復習してゼロベースでも書けるようにがんばります!
    ご指導ありがとうございました。

    キャンセル

+3

入力データを整理する際のデータ構造を変更した方が良いと思います。

現状: [[1, 2], [1, 2], [2, 2], [2, 2], [3, 1]] 
理想: {1: 2, 2: 2, 3: 1}   # 順序が関係ないので、辞書の方が扱いやすい。

理想の構造を得るためには、例えば次のような処理を書きます。

counter = dict()
for x in data:
    if x in counter:
        counter[x] += 1
    else:
        counter[x] = 1

ちなみにこういう処理は良く書くので、collections.Counterを使えば一発でやってくれます。

from collections import Counter
counter = Counter(data)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/21 12:30

    辞書の作り方とても勉強になりました!
    すごい便利ですね~

    これからは辞書を活用したいです!
    ご指導ありがとうございました。

    キャンセル

+3

setdefaultを使うと便利です。指定したキーが辞書になかった場合、そのキーと任意の値を追加できます。

N = int(input())

data = sorted(list(map(int, input().split())))

dic = {}
for x in data:
    dic.setdefault(x, 0)
    dic[x] += 1

print(dic)

maxcount = max(dic.values())
anslist = []
for key, value in dic.items():
    if value == maxcount:
        anslist.append(key)

print(" ".join(map(str, anslist)))

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/20 14:59 編集

    先日collections.defaultdictってのを覚えました。
    d = collections.defaultdict(lambda x: 0)
    みたいに使うそうです。でも不用意にキーにアクセスするとエントリーが追加されてしまいますがw;
    dictでも一要素ずつできるんですね・・・
    ---
    失礼しました。hayataka2049さん回答で使われてましたね。間抜けなことコメントしてすみませんでした。

    キャンセル

  • 2018/04/20 15:05

    Louis0616さんの回答にあるCounterもそうですが、collectionsにはいろいろ便利なモジュールが入っているので使いこなしたいですね。

    キャンセル

  • 2018/04/21 12:29

    辞書の作り方勉強になりました!
    何度も見ながら書いていたら少しずつ分かってきました!

    ゼロベースでも書けるようにがんばりますね!
    ご指導ありがとうございました。

    キャンセル

+2

ほかの方の参考例がはるかにいいと思います。

シンプルに考えました。
2重リストで、重複したリストの要素のみリスト出力し、これをfor文にわたして条件探索

N = int(input())

data = list(map(int,input().split()))

#それぞれの整数と出現回数をリストに2重リストにまとめる
lst = []
for x in data:
    row = []
    count = data.count(x)
    row.append(x)
    row.append(count)
    lst.append(row)   
print(lst)

#出力値 [[1, 2], [1, 2], [2, 2], [2, 2], [3, 1]] 

seen = []
unique_lst = [x for x in lst if x not in seen and not seen.append(x)]

k,v = zip(*unique_lst)

for x in range(len(k)):
    if unique_lst[x][1] == max(v):
        print(unique_lst[x][0], end=' ')

一応2つの実行例の結果も検証しました。参考にしてください。
イメージ説明

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/21 12:28

    元のコードを活かすとこういう形になるんですね!
    シンプルでいいですね!
    ご指導ありがとうございました。

    キャンセル

+2

numpyフル活用だと以下のようになります。

#data化するまでは省略
elem,cnt=np.unique(data)
result=elem(np.where(cnt==np.max(cnt)))

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/21 12:27

    なるほど~
    シンプルでいいですね!
    ご指導ありがとうございました。

    キャンセル

0

import collections
from itertools import groupby
from operator import itemgetter

N = int(input())
data = list(map(int,input().split()))

c = collections.Counter(data).most_common()

res = {}
for (k, g) in groupby(c, key=itemgetter(1)):
    res[k] = sorted([x[0] for x in g])

k = sorted(res.keys(), reverse=True)[0]
print(res[k])


実行例
イメージ説明

参考情報

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.75%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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

  • Python 3.x

    5293questions

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