2016-03-30 2 views
5

Есть функция в Julia, которая ведет себя как функция R's paste()? В частности, если мы дадим функции два вектора, она вернет один вектор с элементарной конкатенацией двух входных векторов.Julia эквивалент функции R's paste()

Я осмотрелся и не могу найти ответ для этого в документах или в противном случае. An older post от John Myles White предполагает, что функция Julia's join() является ближайшим аналогом, но, похоже, она работает только с парами строк, а не по элементам на векторах строк.

На данный момент я просто использую функцию ниже, которая пересекает элементы, вызывающие join(), но мне интересно, есть ли лучший подход.

x = ["aa", "bb", "cc"] 
y = ["dd", "ee", "ff"] 

function mypaste(v1, v2) 
    n = length(v1) 
    res = Array{ASCIIString}(n) 
    for i = 1:n 
     res[i] = join([v1[i], v2[i]]) 
    end 
    return res 
end 

mypaste(x, y) 

Запуск mypaste() дает нам ниже выход, по желанию.

3-element Array{ASCIIString,1}: 
"aadd" 
"bbee" 
"ccff" 

Есть ли хорошая альтернатива? Я неправильно понимаю функцию join()?

ответ

8

Я не думаю, что я хотел бы использовать join вообще. Join используется для объединения строк в одну коллекцию; вы после конкатенации строк в двух разных коллекциях. Таким образом, в то время как это легко (и эффективно), чтобы создать временные коллекции, необходимые для join с zip, вы можете избежать этого, используя string функцию или умножение:

julia> map(string, x, y) 
3-element Array{ASCIIString,1}: 
"aadd" 
"bbee" 
"ccff" 

julia> map(*, x, y) 
3-element Array{ASCIIString,1}: 
"aadd" 
"bbee" 
"ccff" 

Еще лучше (но, возможно, перемудрили), существует оператор умножения на широковещательный элемент .*:

julia> x .* y 
3-element Array{ASCIIString,1}: 
"aadd" 
"bbee" 
"ccff" 
4

Вы можете использовать список понимание и zip, чтобы получить пар:

julia> x = ["aa", "bb", "cc"]; 

julia> y = ["dd", "ee", "ff"]; 

julia> [join(i) for i=zip(x,y)] 
3-element Array{ByteString,1}: 
"aadd" 
"bbee" 
"ccff" 
4

map могут быть использованы. Однострочный - map(join,zip(x,y)). Как показано в следующем примере, который также добавляет z:

julia> x = ["aa","bb","cc"]; 

julia> y = ["dd","ee","ff"]; 

julia> z = ["gg","hh","ii"]; 

julia> map(join,zip(x,y,z)) 
3-element Array{Any,1}: 
"aaddgg" 
"bbeehh" 
"ccffii" 

(см @DSM ответ на список понимания)

Смежные вопросы