Как транслировать векторы (списки) в кортежи в Юлии? - PullRequest
4 голосов
/ 08 апреля 2020

Существует ли функция генератора / итератора, которая преобразует

a = [1,2]
b = [3,4]

в [(1,3),(2,4)] и

a = 1
b = [3,4]

в [(1,3),(1,4)], используя то же выражение?

Есть ли подобный способ создания именованного кортежа, такого как [(a=1,b=3),(a=1,b=4)]?

Ответы [ 2 ]

4 голосов
/ 08 апреля 2020

Вы можете использовать трансляцию с точечным синтаксисом Джулии для этого:

julia> tuple.(a, b)
2-element Array{Tuple{Int64,Int64},1}:
 (1, 3)
 (2, 4)

tuple вот функция, которая просто создает кортеж из своих аргументов.

Для NamedTuple s Вы можете вызывать конструктор нижнего уровня непосредственно в кортежах с

julia> NamedTuple{(:a, :b)}.(tuple.(a, b))
2-element Array{NamedTuple{(:a, :b),Tuple{Int64,Int64}},1}:
 (a = 1, b = 3)
 (a = 2, b = 4)

, где :a и :b - имена отсортированных ключей, или эквивалентно, используя анонимную функцию:

julia> broadcast((a_i, b_i) -> (a=a_i, b=b_i), a, b)
2-element Array{NamedTuple{(:a, :b),Tuple{Int64,Int64}},1}:
 (a = 1, b = 3)
 (a = 2, b = 4)

Надеюсь, это поможет!

4 голосов
/ 08 апреля 2020

Просто передайте функцию tuple.

julia> a = [1,2]; b=[3,4];


julia> tuple.(a,b)
2-element Array{Tuple{Int64,Int64},1}:
 (1, 3)
 (2, 4)

julia> tuple.(1, b)
2-element Array{Tuple{Int64,Int64},1}:
 (1, 3)
 (1, 4)

Второй вопрос - трансляция конструктора:

julia> NamedTuple{(:a, :b)}.(tuple.(1, b))
2-element Array{NamedTuple{(:a, :b),Tuple{Int64,Int64}},1}:
 (a = 1, b = 3)
 (a = 1, b = 4)
...