どうもどうもこんばんは、しーなです。
いやぁ、今日はストレスマックス金曜日が終了して
解放感からか、日本酒祭りになっちゃって、でろんでろんな感じです。(・∀・)ノ
うーん、今日の課題は自分的にはへびーだったので、
ちゃんと見直してから記事にしたかったんだけど
思考能力が低下しているので、びみょーです。
ということで、とりあえず
記事をあっぷして、後でちょっと修正しまーす。
そいで、今日のおつまみとお酒もあとでまとめて更新しまーす!
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']
うーむ・・・・天才かよ!!!ヽ(`Д´)ノ
今日の内容は、よっぱらいには難しかった・・・。
よっぱらいでなくともむずかしい。。。
とりあえず、明日?
脳みそがまともになったら、
もう一回おさらいするね、おかしなことかいてたらごめんなさい。
そいではおやすみなさーい!