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

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

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

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

Q&A

解決済

2回答

871閲覧

リストのソート後の上位5つのみリストに格納する方法がわかりません

1mzmk

総合スコア42

Python 3.x

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

0グッド

0クリップ

投稿2021/09/17 11:00

python

1res = 2[{'search_count':4, 'trend': 'WORDA'}, {'search_count': 3, 'trend': 'WORDB'}, {'search_count': 2, 'trend': 'WORDBXXX'}, {'search_count': 2, 'trend': 'XXWORDA'}, {'search_count': 2, 'trend': 'XXXWORDB'}, {'search_count': 1, 'trend': 'あああいいい'}], {'search_count': 1, 'trend': 'あああえええ'}, {'search_count': 2, 'trend': 'あああううう'}, {'search_count': 2, 'trend': 'あああおおお'} 3 4top5_trend = sorted(res, key=lambda x: x['search_count'], reverse=True) 5# top5_trend = 6 [ 7 {'search_count': 4, 'trend': 'WORDA'}, 8 {'search_count': 3, 'trend': 'WORDB'}, 9 {'search_count': 2, 'trend': 'WORDBXXX'}, 10 {'search_count': 2, 'trend': 'XXWORDA'}, 11 {'search_count': 2, 'trend': 'XXXWORDB'}, 12 {'search_count': 2, 'trend': 'あああおおお'}, 13 {'search_count': 2, 'trend': 'あああううう'}, 14 {'search_count': 1, 'trend': 'あああいいい'}, 15 {'search_count': 1, 'trend': 'あああえええ'} 16 ]

top5_trendのリストから'search_count'キーの数値が大きい上位5位のみをtop5_trendに格納したいと思ってます。
また、上位5番目と同じ'search_count'の値を持つものも一緒に格納したいと思っています。
つまり、今回の場合ですと、以下のようにしたいと考えています。

python

1top5_trend =[ 2 {'search_count': 4, 'trend': 'WORDA'}, 3 {'search_count': 3, 'trend': 'WORDB'}, 4 {'search_count': 2, 'trend': 'WORDBXXX'}, 5 {'search_count': 2, 'trend': 'XXWORDA'}, 6 {'search_count': 2, 'trend': 'XXXWORDB'}, 7 {'search_count': 2, 'trend': 'あああいいい'}, 8 {'search_count': 2, 'trend': 'あああううう'} 9]

実現するために下のようにコードを書いたののですが、うまく実現できません。
具体的には、
if top5_trend[i-1]:
を書いてるにも関わらず、
IndexError: list index out of range
のエラーが出力されてしまうことや、
4行目のfor文を回して、search_countが次の要素とかぶっていなければfor文を止めるやり方がわかっておらず、実現できていないのかと思っています。

よろしくお願いします。

python

1if len(top5_trend) <= 5: #リスト内が5以下の場合 2 ans = {"recommend_trend": top5_trend} 3else: #リスト内が5以上の場合 4 for i in range(0, len(top5_trend)): 5 if i >= 5: 6 if top5_trend[i-1]: 7 if i<= len(top5_trend)-1: 8 if not top5_trend[i-1]["search_count"] == top5_trend[i]["search_count"]: 9 pop_val = len(top5_trend) - 5 10 del top5_trend[i:] 11 print(top5_trend) 12 if top5_trend[i-1]["search_count"] == top5_trend[i]["search_count"]: 13 print("pass") 14

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

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

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

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

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

meg_

2021/09/17 11:20

提示のコード(最初のコード)がエラーで実行出来ません。
guest

回答2

0

ベストアンサー

エラーが出る原因は、以下の文でリストの長さが減っているからです。

del top5_trend[i:]

以下のコードでやってください。

python

1>>> res = [{'search_count': 4, 'trend': 'WORDA'}, 2... {'search_count': 3, 'trend': 'WORDB'}, 3... {'search_count': 2, 'trend': 'WORDBXXX'}, 4... {'search_count': 2, 'trend': 'XXWORDA'}, 5... {'search_count': 2, 'trend': 'XXXWORDB'}, 6... {'search_count': 1, 'trend': 'あああいいい'}, 7... {'search_count': 1, 'trend': 'あああえええ'}, 8... {'search_count': 2, 'trend': 'あああううう'}, 9... {'search_count': 2, 'trend': 'あああおおお'}] 10>>> 11>>> top5_trend = sorted(res, key=lambda x: x['search_count'], reverse=True) 12>>> 13>>> top5 = [x for x in top5_trend if x['search_count'] >= top5_trend[4]['search_count']] 14>>> len(top5) 157 16>>> for x in top5: 17... print(x) 18... 19{'search_count': 4, 'trend': 'WORDA'} 20{'search_count': 3, 'trend': 'WORDB'} 21{'search_count': 2, 'trend': 'WORDBXXX'} 22{'search_count': 2, 'trend': 'XXWORDA'} 23{'search_count': 2, 'trend': 'XXXWORDB'} 24{'search_count': 2, 'trend': 'あああううう'} 25{'search_count': 2, 'trend': 'あああおおお'}

ようするに、並べ替えたものの5番目(top5_trend[4])と比べて大きいか等しいものを取り出せば良いのです。

投稿2021/09/17 11:51

ppaul

総合スコア24666

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

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

1mzmk

2021/09/17 12:41

ご回答ありがとうございます。 ソートをすでにしているなら、五番目の要素と比べてれば良いという発想ができませんでした。とても勉強になりました。 ありがとうございました。
guest

0

if top5_trend[i-1]:

を書いてるにも関わらず、
IndexError: list index out of range
のエラーが出力されてしまうことや、

エラーが発生しているのはif not top5_trend[i-1]["search_count"] == top5_trend[i]["search_count"]:top5_trend[i]の方ではありませんか?


ソート済のリストであれば下記のようなコードでも良いかと思います。

Python

1res = [{'search_count':4, 'trend': 'WORDA'}, {'search_count': 3, 'trend': 'WORDB'}, {'search_count': 2, 'trend': 'WORDBXXX'}, {'search_count': 2, 'trend': 'XXWORDA'}, 2 {'search_count': 2, 'trend': 'XXXWORDB'}, {'search_count': 1, 'trend': 'あああいいい'}, {'search_count': 1, 'trend': 'あああえええ'}, 3 {'search_count': 2, 'trend': 'あああううう'}, {'search_count': 2, 'trend': 'あああおおお'}] 4top5_trend = sorted(res, key=lambda x: x['search_count'], reverse=True) 5 6ans = [] 7num = -1 8count = 0 9for i in top5_trend: 10 if num == i['search_count']: 11 ans.append(i) 12 count += 1 13 else: 14 if count < 5: 15 num = i['search_count'] 16 ans.append(i) 17 count += 1

投稿2021/09/17 11:45

meg_

総合スコア10607

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

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

1mzmk

2021/09/17 12:41

ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問