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

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

Chapter26:単語の順序(Words Order):indexとか

どうもどうも、こんばんは

ああー、週末が終わってしまうことに しょんぼりしてます、しーなです。
明日も明後日も週末だったらいいのに!

1020ごはん
これは今日の晩御飯だよーー。

えっと、今日は、チーズカツさんと、野菜いためさんですね!
いつものように?私がやったのは、
豆腐にキムチをのせた、キムチやっこさんだけ!(・∀・)

色味が足りないって言われたから、つけたしてみた。
何にもない時によくやる、冷奴のバリエーションだよ。
わりと豆腐とキムチってあうよねー。ビールのおともにおすすめです。

さて、おなかも一杯だし、今日も課題を解くよ。

Checkio 26: Electronic Station_Words Order 
問題:テキストと単語のシーケンスがあります。シーケンス内の単語が、指定されたテキストと同じ順序で出現するかどうかを確認する必要があります。

words_order("hi world im here", ["world", "here"]) == True
words_order("hi world im here", ["here", "world"]) == False
words_order("hi world im here", ["world"]) == True
words_order("hi world im here", ["world", "here", "hi"]) == False
words_order("", ["world", "here"]) == False
words_order("hi world world im here", ["world", "world"]) == False
words_order("hi world world im here hi world world im here", ["world", "here"])== True


解き方

  • find()を利用して位置を取得しようとしたら、findは部分一致までひろう。。ダメ
    →完全一致したデータだけ取得したdataを作成する?
  • 位置の取得には、先日覚えたtext.index()を使ってみたい
  • 同じ文字が複数ある場合は、1つだけなのでset()を使用したい
    →setは同じ要素を持てないから結果1つになる

とりあえず最初にPASSするために書いた解答は、findさんでやってみた。
しかし、PASSはしたものの、部分一致までひろっちゃうため、 そこの条件分岐を書いたら、とても長く、何を書いたか本人にもよくわからない・・・ (ここにのせるのは、ちょっと恥ずかしいから闇に葬るw)

ということで、最初から考え直してみるぞ。

  • 完全一致したデータだけ取得したdataを作成する?
  data= [x for x in text.split() if x in words]

おー、それっぽくかけたぞ。
しかし、ここから固まってしまった。
とりあえずは、textの発生順番に並べてみようと思ったけど・・・

 sdata=sorted(data,key=text.index)
 #['world', 'here']
 #['world', 'here']
 #['world']
 #['hi', 'world', 'here']
 #['world', 'im', 'here']
 #['world', 'world', 'world', 'world', 'here', 'here']

文字列を引っ張り出すことはできて、並べ替えても、これと指定された文字列の順番を一致してるかどうかってどう調べるの???

と悩んで、あ!一個にしちゃえばいいやん。と思い当たった。
sortする前に一個にしちゃえばよいのでは。

たどり着いた答え

def words_order(text: str, words: list) -> bool:
 data= [x for x in text.split() if x in words]
 data=set(data)  #←これを足した
 sdata=sorted(data,key=text.index)
 return True if sdata==words else  False #←使ってみたかったw

おお、最初の答えとはまるっきり違う!
ここまでくれば、とくに短く整えない方が、
後から自分がみてわかりやすそうだしね、これで十分だろう!

比較のために、最初の答えも載せるべきかと思ったけど、
ひどい解答には誰も興味はないはずだだだだ!

今日もう一度復習したページ elseを一文に sheena07.hatenablog.com

indexの使い方 sheena07.hatenablog.com

そういえば、調べた関数とかをまとめてどこに書いてあるか、後で参照するために、タグ漬けたいんだけど
どうすればいいんだろうか。
新しくまとめページを作ればよいんだろうか。

・・・最初っからわかりやすい、記事名にしとけばよかったのかー。
検索してもうまくひっかからないよ、辛いねw