如何在 Julia 中将字符串视为数组/向量

duk*_*reg 5 julia

在 Julia 语言中,我想在字符串上使用为 Array{T,1} aka Vector{T} 定义的函数,本质上将其视为 Array{Char,1}。

我想使用的函数示例:

julia> deleteat!("Hrello!",2)
ERROR: MethodError: no method matching deleteat!(::String, ::Int64)
Closest candidates are:
  deleteat!(::Array{T,1} where T, ::Integer) at array.jl:1177
  deleteat!(::Array{T,1} where T, ::Any) at array.jl:1214
  deleteat!(::BitArray{1}, ::Integer) at bitarray.jl:901
  ...
Stacktrace:
 [1] top-level scope at none:0

julia> deleteat!(['H','r','e','l','l','o','!'], 2)
6-element Array{Char,1}:
 'H'
 'e'
 'l'
 'l'
 'o'
 '!'
Run Code Online (Sandbox Code Playgroud)

明确地说,我想以字符串开头并以字符串结尾,但使用数组 {Char,1} 操作来更改字符串。

Jul*_*ner 6

可以将字符串拆分为数组,然后使用该split函数进行操作。

\n\n

例如,可以对上面的代码执行以下操作:

\n\n
julia> deleteat!(split("Hrello!", ""), 2)\n6-element Array{SubString{String},1}:\n "H"\n "e"\n "l"\n "l"\n "o"\n "!"\n
Run Code Online (Sandbox Code Playgroud)\n\n

编辑

\n\n

由于使用 提供了上述代码示例,因此我针对这个问题split进行了以下基准比较。collectsplit

\n\n

结果是collect比如下所示快得多 (> 10X) split

\n\n
julia> VERSION\nv"1.0.3"\n\njulia> using BenchmarkTools\n\njulia> @benchmark deleteat!(split("Hrello!", ""), 2)\nBenchmarkTools.Trial:\n  memory estimate:  1.42 KiB\n  allocs estimate:  26\n  --------------\n  minimum time:     748.396 ns (0.00% GC)\n  median time:      804.819 ns (0.00% GC)\n  mean time:        1.067 \xce\xbcs (20.80% GC)\n  maximum time:     465.984 \xce\xbcs (99.71% GC)\n  --------------\n  samples:          10000\n  evals/sample:     144\n\njulia> @benchmark deleteat!(collect("Hrello!"), 2)\nBenchmarkTools.Trial:\n  memory estimate:  112 bytes\n  allocs estimate:  1\n  --------------\n  minimum time:     60.299 ns (0.00% GC)\n  median time:      65.431 ns (0.00% GC)\n  mean time:        89.189 ns (20.99% GC)\n  maximum time:     66.601 \xce\xbcs (99.83% GC)\n  --------------\n  samples:          10000\n  evals/sample:     1000\n
Run Code Online (Sandbox Code Playgroud)\n\n

@Gnimuccollect首先尝试的建议肯定得到了这个基准的支持。

\n


Gni*_*muc 5

在 Julia 中,应该总是collect首先尝试Vector从其他东西中获取 a 。

julia> deleteat!(collect("Hrello!"), 2)
6-element Array{Char,1}:
 'H'
 'e'
 'l'
 'l'
 'o'
 '!'
Run Code Online (Sandbox Code Playgroud)

  • 您可能应该提到这是必要的,因为字符串是不可变的。 (2认同)
  • `collect` 是要走的路(我通常会使用它)。还可以补充一点,实际上您可以编写 `Vector{Char}(str)` 和 `Vector{UInt8}(str)` 将其转换为字符或代码单元的可变集合。如果您需要一组只读的代码单元,则可以使用 `codeunits` 函数。 (2认同)
  • @dukereg `join` 应该可以完成这项工作。 (2认同)