如何在julia中的元组中平铺命名的元组?

米哈姓

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

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")

BogumiłKamiński

最简单的方法是编写:

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

这样做的缺点是类型不稳定,并且将使所有可迭代对象(不仅NamedTuple是s)变平

如果只想展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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在TypeScript 4.0中将已命名的元组转换为未命名的元组?

来自分类Dev

如何在Julia类型声明的中定义类型的元组

来自分类Dev

如何命名元组属性?

来自分类Dev

numpy中的命名元组

来自分类Dev

为什么不能在命名的元组中将名称的类型指定为Julia中的符号元组?

来自分类Dev

如何在元组列表中向元组添加列表项

来自分类Dev

如何在列表中查找重叠的元组并返回重叠的元组

来自分类Dev

如何在继承元组的类中访问元组的元素

来自分类Dev

遍历列表中的命名元组

来自分类Dev

如何在Julia中将一维数组转换为元组?

来自分类Dev

如何在Julia中将向量(列表)广播到元组?

来自分类Dev

如何在Python中“解压”列表或元组

来自分类Dev

如何在Haskell中反转元组

来自分类Dev

如何在Python中创建N元组?

来自分类Dev

如何在python中增加元组?

来自分类Dev

如何在Python中重塑元组列表?

来自分类Dev

如何在Bixby中定义词汇“元组”?

来自分类Dev

如何在Python中读取元组列表

来自分类Dev

如何在熊猫中搜索值的元组?

来自分类Dev

如何在 C# 中填充元组?

来自分类Dev

如何在 Sqlite 查询中查找对(或元组)?

来自分类Dev

如何在python中聚合元组列表?

来自分类Dev

如何在元组中拆分列表?

来自分类Dev

如何在 TypeScript 中设置元组?

来自分类Dev

数组到Julia中的元组

来自分类Dev

如何访问元组列表中的元组元素

来自分类Dev

在Julia中平铺或重复n维数组

来自分类Dev

几个元组的列表,如何在大元组中提取小元组中前两个相同的元素

来自分类Dev

如何在元组中的每个元组中特定位置的元素上应用函数?

Related 相关文章

热门标签

归档