Dictionary 在朱莉娅的字典里把它压平

Dictionary 在朱莉娅的字典里把它压平,dictionary,julia,flatten,Dictionary,Julia,Flatten,我在茱莉亚有个口述 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] 我想从Dict的内容创建一个数组,由每个Dict条目的总和2:end组成。每个Dict条目中的第一个值是一个标签。输出需要类似于 Output = [ label sum;labe

我在茱莉亚有个口述

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]
我想从Dict的内容创建一个数组,由每个Dict条目的总和2:end组成。每个Dict条目中的第一个值是一个标签。输出需要类似于

Output = [ label sum;label sum;...]
在这种情况下,它将是

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

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

我不确定是否有一些函数可以以这种自定义方式展平字典,但您可以使用
映射来避免循环:

根据你的字典:

CollectedOutputCount = Dict(2 => [278963,1,1], 3 => [283339,1,1], 1 => [272878,0,0,0], 4 => [1234])
您可以在一行中将其展平为[label sum;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)

作为@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阵列

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