【问题标题】:Flatten a Dictionary in Julia在 Julia 中展平字典
【发布时间】:2016-09-03 11:59:53
【问题描述】:

我在 Julia 中有一个字典

In[27]:  CollectedOutputCount
Out[27]: Dict{Any,Any} with 3 entries:
  2 => Any[278963,1,1]
  3 => Any[283339,1,1]
  1 => Any[272878,0,0,0]

我想从字典的内容创建一个数组,该数组由每个字典条目 2:end 的总和组成。每个 Dict 条目中的第一个值是一个标签。输出需要类似于

Output = [ label sum;label sum;...]

在这种情况下是

Output = [278963 2;283339 2;272878 0]

除了在循环中迭代之外,还有其他方法吗?是否有一些功能可以将 Dict 展平为数组(可能在尺寸不均匀的地方使用填充)?

【问题讨论】:

    标签: dictionary julia flatten


    【解决方案1】:

    @niczky12 的替代等效选项,但使用列表理解;

    >>> mydict =  Dict(2 => [278963,1,1], 3 => [283339,1,1], 
                       1 => [272878,0,0,0], 4 => [1234]);
    >>> comp = [[a[1] sum(a[2:end])] for a in values(mydict)];
    

    主要区别在于使用列表推导而不是 map 函数。它们是等价的(在这种情况下)。

    然而,这里的comp 是一个包含 4 个条目的数组,其中每个条目都是一个 1x2 数组。将其翻译成4x2 array

    >>> vcat(comp...)
    4x2 Array{Int64,2}:
       1234  0
     278963  2
     283339  2
     272878  0
    

    但是,如果字典的所有数组都具有相同的长度,则可以将它们连接起来,并替换最后一列:

    >>> mydict = Dict(2 => [278963,1,0], 3 => [283339,1,1], 1 => [272878,0,0])
    >>> vals = hcat(values(mydict)...)';
    >>> hcat(vals[:, 1], sum(vals[:, 2:end], 2))
    3x2 Array{Int64,2}:
     278963  1
     283339  2
     272878  0
    

    虽然,迭代版本可能更有效。


    最后,一个完全迭代的版本,不会创建不必要的临时存储:

    r = zeros(Int64, length(mydict), 2)
    for (n, b) in enumerate(values(mydict))
        r[n, 1] = b[1]
        r[n, 2] = sum(b[2:end])
    end
    

    【讨论】:

      【解决方案2】:

      我不确定可以以这种自定义方式展平字典的函数,但您可以通过使用 map 来避免循环:

      给定你的字典:

      CollectedOutputCount = Dict(2 => [278963,1,1], 3 => [283339,1,1], 1 => [272878,0,0,0], 4 => [1234])
      

      您可以将其展平为 [label sum;标签总和...]在一行中:

      vcat(map(a -> [a[1] sum(a[2:end])], values(CollectedOutputCount))...)
      

      这给了你:

      4x2 Array{Int64,2}:
      1234  0
      278963  2
      283339  2
      272878  0
      

      map 将函数应用于数组的所有元素,在本例中为字典的值迭代器。然后您可以使用vcat 附加这些内容。请注意sum 如何在字典中没有值时为您提供 0,只有 1 元素作为标签 (1234 0)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-26
        • 1970-01-01
        • 1970-01-01
        • 2019-01-11
        • 2021-12-31
        • 2021-06-02
        相关资源
        最近更新 更多