[プログラマー][ハッシュ]ベストアルバム


私の髪の草

from collections import defaultdict
def solution(genres, plays):
    answer = []
    genre_play_total_cnt = defaultdict(lambda: 0)
    for genre, play in zip(genres, plays):
        genre_play_total_cnt[genre] += play
    genre_rank = [genre for genre, play in sorted(genre_play_total_cnt.items(), key = lambda x:x[1], reverse=True)]
    
    genre_play = defaultdict(lambda: [])
    for i in range(0, len(genres)):
        genre_play[genres[i]] += [[i, plays[i]]]
    
    for genre in genre_rank:
        result = sorted(genre_play[genre], key = lambda x: (x[1]), reverse=True)
        if len(result) > 1:
            answer.append(result[0][0])
            answer.append(result[1][0])
        else :
            answer.append(result[0][0])
    return answer
この問題はdictとlistを自由に使うことを学ばなければ解けない(難しいことを意味する).解答を参照して、解答とは言えません.
プロセス全体を理解するには、
1.まず各タイプの再生回数の総和(gene play total cnt)を求める.
2.このdictを用いて、ソートにより再生順にソートされたGeneral rankを求める.
3.各タイプのインデックスと再生回数を保存するGeneral play dicksherを作成します.
4.再生回数の降順に並べ、2つまたは1つを入れます.
(gene rankではdict.items()という名前の関数が使用され、key、Valueペアをdict itemsオブジェクトに返す関数です.このオブジェクトの可用性はリストと同じです.)
この場合、sort時にlambda x:(x[1],x[0])を入れると、インデックスも降順に並べられ、答えが間違ってしまうことに注意してください(最初の試みに失敗すると、インデックスは昇順に並べられます).また、結果リストは常に2つ以上ではない場合があります.したがって、2つをランダムに入れると、ランタイムエラー(2回目の試行に失敗)が発生する可能性があります.
これはディック・シャナリー、リストのソートに慣れている問題だと思います.忘れる前に解いてみよう