pythonの「or」はちょっとくせ者っぽい

8月 29th, 2016

単純に特定の単語なりフレーズなりが入っているかどうかを調べるだけなら、pythonの場合難しくない。

例えば、「りんごとみかんとぶどうのジュースがあります」という文の中に「ぶどうのジュース」というフレーズがあるかを調べたいなら・・・

if 'ぶどうのジュース' in 'りんごとみかんとぶどうのジュースがあります':
  print ('あります')
else:
  print ('ありません')

とこんな風に書けばいい。「フレーズ」in「調べたい文等」。コンピュータは、基本的に文章を理解しないので、フレーズや文でなくても、「あいうえお」でも「12ごあうewoa」でもなんでもいい(いわゆる「文字列」)。「文字列同じものがあれば「ある」、なければ「ない」とただ判断するだけ。ちなみにprintは表示しなさい、という文章。ifとelseは「もし~ならA、そうでなければB」というまあ、見ての通りの内容。・・・ってこんないい加減な説明では駄目駄目だけれども・・・今日の問題はそこじゃぁなくて。

調べたい文字列が複数ある場合、どうするんだ、という素朴な疑問があって、ちょっと調べてみた。

何回も書くのが面倒なので、ちょっとりんごとみかんの例文は「menu」という名前の箱に入って貰うことにする。

menu=りんごとみかんとぶどうのジュースがあります’

さて、ここで、プログラムに上記menuを見て、「りんごジュース」があるかを判断してもらおう。人間なら、一目で「あるじゃん」と分かるが、プログラムはそうは行かない。何しろ「りんごジュース」というフレーズはmenuには書いていないのだから。

というわけで・・・こんな感じ。

if ('りんご' and 'ジュース') in menu:
  print ('りんごジュースあります')

else以下は以下同文。

ところが・・・menuの中にりんごかぶどうがあれば「ある」と返してもらおうとすると困ったことになる。

if ('りんご' or 'ぶどう') in menu:
  print ('りんごかぶどうがあります')

これをやってみたところ、「りんご」には反応するが、ぶどうは華麗にスルーされてしまった。andで行けたからorでも行けるかと思ったらそうは問屋が卸さないらしい。

まあ、人間の目から見れば「あるじゃん」なのだけれども、よーく考えるとandとorの場合では、論理的な構図がちと違うような気がしないこともない。

これができたら短く書けていいと思ったのに、残念だ~。

久々に更新したと思ったら妙なネタで申し訳ない・・・文系向き(?)pythonの話はいずれきちんと整理して書くつもり。今はぶち当たった問題をちまちま書き留めるメモもどきなのでお許しを。

追記:完全一致で調べるなら、「or」は意外と簡単。あるかどうか、だと面倒だが。

fruit=’りんご’

であるとして、fruitがりんごかぶどう、みかんと一致したら「果物」だと返事をさせてみる。

if fruit in ['りんご','ぶどう','みかん']:
  print ('果物です')

まあ、発想の転換でこんなのもありかも。

if fruit in 'りんごかぶどうかみかん':
  print ('果物です')

今、これってある意味とっても文系的なんじゃないかって気がした・・・

関連記事

  1. リスト全ての要素の改行(’\n’)を削る
  2. 変数のidや型をprint文で表示させる
  3. printでの「,」と「+」
  4. オブジェクト指向と大格闘2(無理矢理使ってみる)
  5. 他のクラスからインスタンス変数って使えるんだね
  6. 同じclass内にあるメソッドを呼び出してみる

Comments are closed.