【问题标题】:How to manipulate named tuples如何操作命名元组
【发布时间】:2020-03-27 10:00:06
【问题描述】:

我喜欢这个想法 NamedTuple 很多,作为Tuple 和完整的、用户定义的复合类型之间的中间地带。

我知道如何构建命名元组并访问其中一个字段

julia> nt = (a=1, b=2.0)
(a = 1, b = 2.0)

julia> nt.a
1

但是,我知道的不多,甚至不知道是否可以做更多的事情。我正在考虑很多我们可以操作普通元组的方法(通常涉及 splatting),并且想知道其中一些是否也适用于命名元组。例如,如何:

  • 从字段和值列表动态构建NamedTuple
  • 增长 NamedTuple ,即向其添加新的字段值对
  • “更新”(在不可变的意义上)现有命名元组中的字段

【问题讨论】:

    标签: julia


    【解决方案1】:

    NamedTupleTools 包中包含很多旨在利用NamedTuples的工具更多 直截了当。但是这里有一些可以执行的基本操作 “手动”在他们身上:


    创作

           # regular syntax
    julia> nt = (a=1, b=2.)
    (a = 1, b = 2.0)
    
           # empty named tuple (useful as a seed that will later grow)
    julia> NamedTuple()
    NamedTuple()
    
           # only one entry => don't forget the comma
    julia> (a=1,)
    (a = 1,)
    


    增长和“修改”

    可以 merge二 命名元组来创建一个新的:

    julia> merge(nt, (c=3, d=4.))
    (a = 1, b = 2.0, c = 3, d = 4.0)
    

    ...或者通过在创建一个 新的:

    julia> (; nt..., c=3, d=4.)
    (a = 1, b = 2.0, c = 3, d = 4.0)
    

    当同一个字段名多次出现时,最后一次出现是 保留。这允许一种“带修改的复制”的形式:

    julia> nt
    (a = 1, b = 2.0)
    
    julia> merge(nt, (b=3,))
    (a = 1, b = 3)
    
    julia> (; nt..., b=3)
    (a = 1, b = 3)
    


    动态操作

    在上述各种技术中使用field=>value 对允许 更动态的操作:

    julia> field = :c;
    
    julia> merge(nt, [field=>1])
    (a = 1, b = 2.0, c = 1)
    
    julia> (; nt..., field=>1)
    (a = 1, b = 2.0, c = 1)
    

    同样的技术可用于从现有的动态数据结构构建NamedTuples

    julia> dic = Dict(:a=>1, :b=>2);
    julia> (; dic...)
    (a = 1, b = 2)
    
    julia> arr = [:a=>1, :b=>2];
    julia> (; arr...)
    (a = 1, b = 2)
    


    迭代

    迭代 NamedTuple 迭代其值:

    julia> for val in nt
               println(val)
           end
    1
    2.0
    

    与所有键->值结构一样, keys函数 可用于遍历字段:

    julia> for field in keys(nt)
               val = nt[field]
               println("$field => $val")
           end
    a => 1
    b => 2.0
    

    【讨论】:

    • 不错的答案。请注意,如果您想 merge 单个键值对,您需要添加一个逗号:merge(nt, (c=3,))
    猜你喜欢
    • 1970-01-01
    • 2023-03-29
    • 2015-03-10
    • 2014-09-19
    • 1970-01-01
    • 2019-11-08
    • 2017-07-11
    • 2021-02-12
    • 1970-01-01
    相关资源
    最近更新 更多