tuples - 如何在 Julia 的元组中展平命名元组?

标签 tuples julia

我有一个 Tuple 元素,其中一些是 NamedTuple。我想像这样展平 NamedTuple:

julia> nt = (a="a", b="b")
(a = "a", b = "b")

julia> t = (1, 2, 3, nt)
(1, 2, 3, (a = "a", b = "b"))

julia> res = tuple(1, 2, 3, nt...)
(1, 2, 3, "a", "b")

如何以编程方式执行此操作?我尝试了以下方法:

julia> exprs = [x isa NamedTuple ? Meta.parse("$x...") : x for x in t]
4-element Array{Any,1}:
 1                        
 2                        
 3                        
  :((a = "a", b = "b")...)

julia> res = tuple(eval(ex) for ex in exprs)
(Base.Generator{Array{Any,1},typeof(eval)}(Base.MainInclude.eval, Any[1, 2, 3, :((a = "a", b = "b")...)]),)

但它并不能完全满足我的要求: (1, 2, 3, "a", "b")

最佳答案

最简单的方法是写:

julia> Tuple(Iterators.flatten((1,2,3, (a="a",b="b"))))
(1, 2, 3, "a", "b")

这有一个缺点,它是类型不稳定的,并且它会展平所有的可迭代对象(不仅是 NamedTuples)。

如果你只想将 NamedTuple 扁平化,那么可以使用类似这样的东西:

julia> Tuple(reduce((a,b) -> (b isa NamedTuple ? append! : push!)(a, b), (1,2,3, (a="a",b="b")), init=[]))
(1, 2, 3, "a", "b")

(还是会不稳定)

如果你想要稳定的类型,你可以使用递归,例如像这样:

flatten() = ()
flatten(a::NamedTuple) = Tuple(a)
flatten(a) = (a,)
flatten(a::NamedTuple, b...) = tuple(a..., flatten(b...)...)
flatten(a, b...) = tuple(a, flatten(b...)...)
flatten_tuple(x::Tuple) = flatten(x...)

现在你有:

julia> flatten_tuple((1,2,3, (a="a",b="b")))
(1, 2, 3, "a", "b")

julia> @code_warntype flatten_tuple((1,2,3, (a="a",b="b")))
Variables
  #self#::Core.Compiler.Const(flatten_tuple, false)
  x::Tuple{Int64,Int64,Int64,NamedTuple{(:a, :b),Tuple{String,String}}}

Body::Tuple{Int64,Int64,Int64,String,String}
1 ─ %1 = Core._apply_iterate(Base.iterate, Main.flatten, x)::Tuple{Int64,Int64,Int64,String,String}
└──      return %1

关于tuples - 如何在 Julia 的元组中展平命名元组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64350433/

相关文章:

c++ - std::tuple sizeof,是不是错过了优化?

time-series - 我可以使用非日期类型作为 Julia 中 TimeSeries 对象的时间索引吗?

arrays - Julia 矢量 : Excessive Memory Usage

parallel-processing - 你能在没有特殊数组的情况下在 Julia 中并行化不精确的雅可比计算吗?

typescript - 如何获得元组元组的扁平元组类型?

python - 将文本文件中的字符串(已经是元组格式)转换为元组列表

python - 如何在 Python 字典中引用多个值?

Python识别字符串集中的后缀

dataframe - 如何 reshape 、分组和重命名 Julia 数据框?

pandas - Julia 中 pandas `dropna` 的类似物