2016-05-08 25 views
4

Ich habe eine Dict in JuliaFlatten ein Wörterbuch in 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] 

ich ein Array aus dem Inhalt des Dict der Summe der einzelnen Dict Einträge aus erstellen möchten 2: Ende. Der erste Wert in jedem Dict-Eintrag ist eine Beschriftung. Der Ausgang muss so etwas wie

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

in diesem Fall ist es von Iterieren diese auseinander zu tun, in Schleifen

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

Gibt es eine Möglichkeit sein würde? Gibt es eine Funktion, um ein Dict in ein Array zu glätten (wahrscheinlich mit Padding, wo es ungleiche Dimensionen gibt)?

Antwort

2

Ich bin über Funktionen nicht sicher, ob die Wörterbücher in einer solchen Art und Weise individuelle abflachen können, aber Sie können die Schleifen vermeiden, indem map mit:

Bei Ihrem Wörterbuch:

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

Sie können es flach in [Etikett Summe; Label Summe ...] in einer Zeile:

für Ihren Wörterbuch
4x2 Array{Int64,2}: 
1234 0 
278963 2 
283339 2 
272878 0 

map wendet eine Funktion auf alle Elemente eines Arrays, in diesem Fall die Werte Iterator:

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

Was gibt Ihnen. Dann können Sie diese mit vcat anhängen. Beachten Sie, wie sum Ihnen 0 gab, wenn keine Werte im Wörterbuch vorhanden waren, nur das 1-Element als Label (1234 0).

1

Eine alternative äquivalente Option zu der von @ niczky12, aber mit Listenverständnis;

>>> 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)]; 

Der Hauptunterschied ist die Verwendung von Liste statt map Funktion Comprehensions. Sie sind (in diesem Fall) gleichwertig.

Hier ist comp jedoch ein Array mit 4 Einträgen, wobei jeder Eintrag ein 1x2-Array ist. Zu übersetzen, um es zu einem 4x2 array:

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

Wenn alle Felder des Wörterbuchs die gleiche Länge haben, aber man konnte sie verketten, und ersetzen Sie die letzte Spalte:

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

Obwohl , die iterative Version ist wahrscheinlich effizienter.


Last, eine vollständig iterative Version, die nicht unnötige temporäre Speicherung schafft:

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