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

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

Chapter35:文字列の並べ替え(sort by extention):bool型の使い方

どうもどうもこんばんは、しーなです。

いやぁ、今日はストレスマックス金曜日が終了して
解放感からか、日本酒祭りになっちゃって、でろんでろんな感じです。(・∀・)ノ

うーん、今日の課題は自分的にはへびーだったので、
ちゃんと見直してから記事にしたかったんだけど
思考能力が低下しているので、びみょーです。

ということで、とりあえず 記事をあっぷして、後でちょっと修正しまーす。
そいで、今日のおつまみとお酒もあとでまとめて更新しまーす!


Checkio 35:Electronic Station sort by extention
問題:文字列をファイル拡張子で並べ替える

  • ファイル名は空の文字列にできません。
  • 並べ替え順序: 名前のないファイル、拡張子のないファイル、名前と拡張子のあるファイル。
  • ファイル名.configまたはconfig.はすべて拡張子が空の名前です。
  • str1.str2.str3のようなファイル名には、拡張子str3と名前str1.str2があります。
  • .str1.str2のようなファイル名には、拡張子str2と名前.str1が付きます。
    • sort_by_ext(['1.cad', '1.bat', '1.aa']) == ['1.aa', '1.bat', '1.cad']
    • sort_by_ext(['1.cad', '1.bat', '1.aa', '2.bat']) == ['1.aa', '1.bat', '2.bat', '1.cad']
    • sort_by_ext(['1.cad', '1.bat', '1.aa', '.bat']) == ['.bat', '1.aa', '1.bat', '1.cad']
    • sort_by_ext(['1.cad', '1.bat', '.aa', '.bat']) == ['.aa', '.bat', '1.bat', '1.cad']
    • sort_by_ext(['1.cad', '1.', '1.aa']) == ['1.', '1.aa', '1.cad']
    • sort_by_ext(['1.cad', '1.bat', '1.aa', '1.aa.doc']) == ['1.aa', '1.bat', '1.cad', '1.aa.doc']
    • sort_by_ext(['1.cad', '1.bat', '1.aa', '.aa.doc']) == ['1.aa', '1.bat', '1.cad', '.aa.doc']

解き方

  • 単純にファイルの拡張子で並べ替える、というだけではない。
  • ファイル名と拡張子のないものは先にくる
  • ファイル名がある場合は、拡張子、ファイル名でソートすればいい? 混乱してきたんだけど・・・。 条件分岐がうまくできない。

これはやめとこうかなーって、一度ブラウザの戻るを押しちゃったよwww
しかし、まだ問題のこってるしなー・・・
もう少しだけ、粘ってみるか、と問題にとりくみましたが。。。。

最初の答えは、もうトライアンドエラーの繰り返しで、
エラーがでたら条件をつけ足して、という形でものすごーく長くなりましたw
なんとか、各パターンの場合のelifを数回重ねて、PASSはしたものの・・・。
今読み返しても、本人にもどう動いてるかよくわからないという出来でしたw


ということで、最初の回答はやはり闇に葬り
(最近、そればっかだねw)

気を取り直して素敵解を見に行ったものの、
今回は、どれも何が書いてあるかがわからない。。。
呪文を目で追っていたら、意味がわからなすぎてちょっと気持ち悪くなってきた・・==;


partialだの、今まで見たことない関数がいっぱいなの・・。
boolって、なんでこういう使い方すんの・・・????的な。。
どの解をみてても、目が泳ぐ・・・。

仕方がないので、腹を据えて一つ解読してみよう・・・。

  • 素敵解
def sort_by_ext(text): 
  sortkey= lambda x: (bool(x[:(i:=x.rfind("."))]),x[i+1:],x[:i])
  return sorted(text,key=sortkey)

てか、短くないwww?  
私の答えなど、34行だったというのにーw

まず最初に気になったはここ

i:=x.rfind(".")

:=ってなんだっけ???? と思って調べたら、代入らしい。
⁼との違いがよくわからなかったけど。 まあ、これは問題ないから次!

そして次に気になったが、ここ

 bool(x[:(i:=x.rfind("."))])

bool型って、TrueかFalseかではありませんでした????
なんで、ここでbool型に変えてんの???


bool:他の型のオブジェクトをbool型のTrueかFalseに変換できる。


・・・えーと??? もしやまたあれ?

真実は数えられる系の使い方???==; sheena07.hatenablog.com ↑真実は数えられる系のはなしw



とりあえず説明をみてみたけれども・・

TrueでもFalseでも、空でない文字列str型はすべてTrue。空文字列はFalse。

うーん、結局、どういう意味??
ピンとこないので、動きを確認してみる。

print(bool("True"))
print(bool("False"))
print(bool("bat"))
print(bool(""))
# True
# True
# True
# False

ふーーーん???

んじゃ、今回の場合boolに変換しないとどうなるの??

text=['1.cad', '1.bat', '1.aa', '2.bat']
sortkey= lambda x: (((x[:(i:=x.rfind("."))])),x[i+1:])
a=sorted(text,key=sortkey)
print(a)
#['1.aa', '1.bat', '1.cad', '2.bat']

なるほど、1が優先されてて、1.cadが2.batの前に出てきてしまうと。
ファイル名の方が優先されるんですよね。なるほど。

・・・んー.。
ここをboolさんでファイル名をくくることによって、コントロールしている。
ってことかぁ。。。

print(bool("1"))
print(bool("2"))
print(bool("3"))
# True
# True
# True

・・・・・確かに、結果をみると、全部同じ扱い!!!!
1でも2でも、int型がすべて同様に扱われるのね。

そういえば、前に調べたときに、Trueが1でFalseは0ってなってましたよね。 ファイル名が空白の場合Falseで0だから最初にくるの?????

text=['9.ab', '.ab', '5.ab']

sortkey= lambda x: ((bool(x[:(i:=x.rfind("."))])),x[i+1:])
a=sorted(text,key=sortkey)
print(a)
#['.ab', '9.ab', '5.ab']

そいで最後のx[:i]は、同じ条件になったら、ファイル名の順番で整えるってことなのかな。。
そうかーまずはファイル名の有無だけでソートするのに、bool型でソートするわけですか。

text=['9.ab', '.ab', '5.ab']
sortkey= lambda x: ((bool(x[:(i:=x.rfind("."))])),x[i+1:],x[:i])
a=sorted(text,key=sortkey)
print(a)
#['.ab', '5.ab', '9.ab']

うーむ・・・・天才かよ!!!ヽ(`Д´)ノ
今日の内容は、よっぱらいには難しかった・・・。 よっぱらいでなくともむずかしい。。。


とりあえず、明日? 脳みそがまともになったら、
もう一回おさらいするね、おかしなことかいてたらごめんなさい。

そいではおやすみなさーい!