🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

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

Q&A

解決済

6回答

4211閲覧

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

python3_beginer

総合スコア46

Python 3.x

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

0グッド

1クリップ

投稿2018/04/20 04:50

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

#質問

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

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

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

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

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

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

guest

回答6

0

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 05:40

Udomomo

総合スコア1524

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

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

KSwordOfHaste

2018/04/20 06:03 編集

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

2018/04/20 06:05

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

2018/04/21 03:29

辞書の作り方勉強になりました! 何度も見ながら書いていたら少しずつ分かってきました! ゼロベースでも書けるようにがんばりますね! ご指導ありがとうございました。
guest

0

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

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

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

Python

1counter = dict() 2for x in data: 3 if x in counter: 4 counter[x] += 1 5 else: 6 counter[x] = 1

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

Python

1from collections import Counter 2counter = Counter(data)

投稿2018/04/20 05:40

LouiS0616

総合スコア35668

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

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

python3_beginer

2018/04/21 03:30

辞書の作り方とても勉強になりました! すごい便利ですね~ これからは辞書を活用したいです! ご指導ありがとうございました。
guest

0

ベストアンサー

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

python

1for x in set(data): 2 row = [] 3 count = data.count(x) 4 row.append(x) 5 row.append(count) 6 lst.append(row)

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

python

1from collections import defaultdict 2from itertools import takewhile 3 4N = int(input()) 5 6data = list(map(int,input().split())) 7 8d = defaultdict(int) 9for x in data: 10 d[x] += 1 11 12lst = sorted(d.items(), key=lambda x:x[1], reverse=True) 13 14v0 = lst[0][1] 15 16print(" ".join([str(k) for k,v in sorted(takewhile(lambda x: x[1]==v0, lst), 17 key=lambda x:x[0])]))

投稿2018/04/20 05:38

hayataka2049

総合スコア30935

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

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

python3_beginer

2018/04/21 03:31

何度も書いて練習していたらようやく理解できました!! 便利な機能ばかりで、感動しました! とにかく毎日復習してゼロベースでも書けるようにがんばります! ご指導ありがとうございました。
guest

0

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

python

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

投稿2018/04/20 07:52

R.Shigemori

総合スコア3376

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

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

python3_beginer

2018/04/21 03:27

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

0

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

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

Python

1N = int(input()) 2 3data = list(map(int,input().split())) 4 5#それぞれの整数と出現回数をリストに2重リストにまとめる 6lst = [] 7for x in data: 8 row = [] 9 count = data.count(x) 10 row.append(x) 11 row.append(count) 12 lst.append(row) 13print(lst) 14 15#出力値 [[1, 2], [1, 2], [2, 2], [2, 2], [3, 1]] 16 17seen = [] 18unique_lst = [x for x in lst if x not in seen and not seen.append(x)] 19 20k,v = zip(*unique_lst) 21 22for x in range(len(k)): 23 if unique_lst[x][1] == max(v): 24 print(unique_lst[x][0], end=' ')

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

投稿2018/04/20 06:14

kawakawa2018

総合スコア1195

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

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

python3_beginer

2018/04/21 03:28

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

0

python

1import collections 2from itertools import groupby 3from operator import itemgetter 4 5N = int(input()) 6data = list(map(int,input().split())) 7 8c = collections.Counter(data).most_common() 9 10res = {} 11for (k, g) in groupby(c, key=itemgetter(1)): 12 res[k] = sorted([x[0] for x in g]) 13 14k = sorted(res.keys(), reverse=True)[0] 15print(res[k])

実行例
イメージ説明

参考情報

  • Pythonで単語の数え上げとかするならCounterを使うと便利なはなし

https://qiita.com/hatchinee/items/a904c1f8d732a4686c9d

  • 以外と知られていない!? Python標準ライブラリの関数groupby

https://qiita.com/tag1216/items/9aecc6816371ee35215e

投稿2018/04/21 04:51

katoy

総合スコア22324

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問