裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

Julia の小ネタ--036 文字が文字列に含まれるか?

2021年09月16日 | ブログラミング

多くの言語では,1 文字が文字列中にあるかどうかは簡単な関数で調べることができる。

たとえば,Python なら

"abcdefg".find("c")   # 2
"abcdefg".find("z")   # -1 存在しない場合

Julia では,

occursin("c", "abcdefg")   # true
occursin("xyz", "abcdefg") # false

Julia の indexin(a, b) は a が b に含まれないときには nothing を返すという,ありがたいんだかありがたくないんだか,微妙な仕様になっている。

そこで,以下のような find 関数を実装してみた。

indexin() の a, b は配列でもよいのだけど,find() の第1引数は 文字型(Char)もしくは長さ1の文字列,第2引数は文字列または整数に限定する。引数の組み合わせとして4通りあるので,find() も 4 通り書き,最終的に5番目に定義する関数が呼ばれる。5番目の関数の第1引数は Char型,第2引数は Vector{Char} である。indexin() を呼び,結果が nothing のときには 0 を返すようにしている。

find(c::Char,   n::Int)     = find(c, string(n))
find(c::Char,   s::String)  = find(c, Char[s...])
find(s::String, n::Int)     = find(Char(s...), string(n))
find(s::String, ss::String) = find(Char(s...), Char[ss...])
function find(c::Char, cc::Vector{Char})
    x = indexin(c, cc)[1]
    isnothing.(x) ? 0 : x
end

この関数群がどのように働くかは実行例を見れば一目瞭然。

find('3', 123)   # 3
find('4', 123)   # 0
find('3', "123") # 3
find('4', "123") # 0
find("3", 123)   # 3
find("4", 123)   # 0
find("3", "123") # 3
find("4", "123") # 0

 

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« Julia の小ネタ--035 文字列... | トップ | Julia の小ネタ--037 大小順... »
最新の画像もっと見る

コメントを投稿

ブログラミング」カテゴリの最新記事