しーなのたらたらプログラミング学習日記

よれたOLの、びみょーなプログラム学習日記です

Chapter24:要素の頻度(frequency_sort)indexの使い方!

どうもどうも、こんばんは!
週末ですね、週末がやってきましたよー><

とりあえず、今日は夕方から入ってた、
しんどい会議も乗り越えたし、 めでたいので、
ちょっといいビールをぷしゅーーってしたよ!

1018ごはん
あ、これは今日のごはん。 ごはんというおつまみ?

えっと、先日水芭蕉を飲んだときに、きれいに写真を撮ってLINEで送ったら

sheena07.hatenablog.com ↑この記事ね・・・

母がいたくご機嫌だったので、居候の身としては・・・ 余力がある時は、ご飯を並べて写メをとろうかなと思いました。

はい、ほぼ作ってもらってるしねw

今日も私がつくったものは左上にある、
かつおぶしまみれの レンチンした、薄切り玉ねぎだけです、えっへんw

しかし、レンチンたまねぎをなめてもらっては困るのです。
薄切りスライスのレンチンをしたたまねぎにー

ちょっぴりの味ぽんをかけて、かつおぶしをかけてぐるぐるして
うえに小ねぎをまぶしたら!

あらふしぎ!すごくおいしいおつまみなんだよ。
まあ、今日は小ねぎをかけてから、うっかり鰹節をしちゃったから 茶色だけどさ・・・w

って、違った違った。
今日は料理ネタを書きたいわけではとくにないので
ビールをのみながら、お題にいくのです。
(あとで、余力あったら、今週のごはんをまとめるね。特にいらんかなw)

Checkio 24:frequency_sort
問題:指定されたリストを並べ替えて、グループ化しリスト内での要素の出現回数の降順になるように並べ替えます。
2つの要素の頻度が同じ場合、リスト内での要素の最初の出現と同じ順序になります。
list(frequency_sort([4, 6, 2, 2, 6, 4, 4, 4])) == [4, 4, 4, 4, 6, 6, 2, 2]
list(frequency_sort(["bob", "bob", "carl", "alex", "bob"])) == ["bob","bob","bob","carl","alex",]
list(frequency_sort([17, 99, 42])) == [17, 99, 42]


解き方

  • Counterのmost_common()を使って確認する?
  • sort()を使って確認?
  • count()でもいけるのか?

  • 最初の答え

from collections import Counter
def frequency_sort(array):
   result=[]
   ct=Counter(array)  
   for  k,v in ct.most_common(): #k=ct.keys v=ct.values?
    for _ in range(v):
        result.append(k)
   return result

結局、あーだこーだと頑張ったけど、うまく解けなかった><
ということで、こちらは、ググったらでてきた解。
うーん、こういう風にやるんだな。というのは分かってPASSはしたけど。。 自力ではない。。。


kとVって、keyとvalueのことですよね、きっと。 こんな風に使えるんですねー。

sheena07.hatenablog.com ↑keyとvalueの使い方はここをみてね

for _in rangeという使い方も初めて知りました。
(変数を使ってないときは、省略できるそうです)



・・・じゃあ気を取り直して、Sort()を使った場合を考えてみる

b=sorted(array,key=lambda x: (-array.count(x)))
print(b)
 #[4, 4, 4, 4, 6, 2, 2, 6]

今まで見たやり方だとこうなるかな、と思ったが思い通りにならない。
array.count()でいけるのかなーって思ったんだけどなぁ。
6と2の並びがおかしいね。

[4, 4, 4, 4, 6, 6, 2, 2]

↑が正解なので 同じ回数の時におかしくなるのかな?
ちなみに、

-array.count(x)

というのは、逆にするときに使えるらしい。(reverseの意味: - )
ここからどうするのか思いつかなかったので、ほかの人の解答を見せてもらう。

  • 素敵な答えその1
 b=sorted(array,key=lambda x: (-array.count(x),array.index(x)))
 print(b)
#[4, 4, 4, 4, 6, 6, 2, 2]

array.indexでも並べている・・・
lambdaの処理式は、2個重ねてもよいということなのね。
この場合って、sortは1個目を優先するんでしょうね。。。

  • 素敵な答えその2
items=sorted(array,key=array.index)
a= sorted(items,key=items.count ,reverse=True )

こういうのもあった。最初に配列をindex順に並べている

あれ、indexの値って変動しないの????(2回でたらどうなるの?)
array.index()の挙動が気になったので、確認してみた。

data=[4, 6, 2, 2, 6, 4, 4, 4]
   for i in data:
     print(data.index(i))
   # 0,1,2,2,1,0,0,0

なるほど、これって、リストの中で一番最初にでた順番なんだ! (今頃ww?)
全然indexさんのこと知らなかったみたいです。

出現するたびに更新されるのかと思ってたの。
うーん、これは、今後うまく使ってみたいなー。