Julia 在朱莉娅的字典里做一个矩阵,其中的键是我必须拆分的字符串

Julia 在朱莉娅的字典里做一个矩阵,其中的键是我必须拆分的字符串,julia,Julia,我有一本这种形式的词典 "san-diego.new-york" => 0.225 "seattle.topeka" => 0.162 "san-diego.chicago" => 0.162 "seattle.new-york" => 0.225 "san-diego.topeka" => 0.126 "seattle.chicago" => 0.153 我想把它转换成一个2x3矩阵,其中I是西雅图圣地亚哥的集合,j是纽约托皮卡芝加

我有一本这种形式的词典

"san-diego.new-york" => 0.225
"seattle.topeka"     => 0.162
"san-diego.chicago"  => 0.162
"seattle.new-york"   => 0.225
"san-diego.topeka"   => 0.126
"seattle.chicago"    => 0.153
我想把它转换成一个
2x3
矩阵,其中
I
是西雅图圣地亚哥
的集合,
j
是纽约托皮卡芝加哥
的集合。我曾尝试使用
split.(keys(dict),“)
拆分键,但没有成功

我想这样做是为了在之后进行形式
M[I][j]=0.5的计算

编辑:我制作了一个新字典,其中键是元组。我不知道这是否有用

c = Dict("san-diego.new-york" => 0.225, "seattle.topeka" => 0.162, "san-diego.chicago"  => 0.162
, "seattle.new-york"   => 0.225, "san-diego.topeka"   => 0.126, "seattle.chicago"    => 0.153)

a = split.(keys(c),".")
b = collect(values(c))

new_c = Dict((a[i][1],a[i][2])=>b[i] for i in 1:length(b))
我最终编写了以下函数

function fillmatrix()

    c = Dict("san-diego.new-york" => 0.225, "seattle.topeka"     => 0.162, "san-diego.chicago"  => 0.162
    , "seattle.new-york"   => 0.225, "san-diego.topeka"   => 0.126, "seattle.chicago"    => 0.153)

    a = split.(keys(c),".")
    b = collect(values(c))

    new_c = Dict((a[i][1],a[i][2])=>b[i] for i=1:length(b))

    list_i = []
    list_j = []
    for (u,v) in keys(new_c)
        push!(list_i,u)
        push!(list_j,v)
    end

    i = unique(list_i)
    j = unique(list_j)

    A = zeros((length(i),length(j)))


    for ii in i
        for jj in j
            A[findfirst(x->x==ii,i),findfirst(x->x==jj,j)] = new_c[(ii,jj)]
        end
    end

    return A
end
但这似乎是一个很长的解决方法,我想把它推广到更多的维度。有什么想法吗?
提前谢谢。

我将从您的原始词典中给出解决方案(另一个可以相应调整)。您可以使用namedarray.jl包来解决您的问题。以下是完整的解决方案:

using NamedArrays

d = Dict("san-diego.new-york" => 0.225,
         "seattle.topeka"     => 0.162,
         "san-diego.chicago"  => 0.162,
         "seattle.new-york"   => 0.225,
         "san-diego.topeka"   => 0.126,
         "seattle.chicago"    => 0.153)

s = split.(keys(d), '.')
row = unique(string.(getindex.(s, 1)))
col = unique(string.(getindex.(s, 2)))

m = NamedArray([d[r*"."*c] for r in row, c in col],
               (row, col), ("from", "to"))
(这假设所有行-列对都以其他方式存在,而不是
d[r*”“*c]
write
get(d,r*”“*c,缺失)
,并且字典中不存在的条目中缺少值)

现在你可以写:

julia> m
2×3 Named Array{Float64,2}
from ╲ to │ new-york    topeka   chicago
──────────┼─────────────────────────────
san-diego │    0.225     0.126     0.162
seattle   │    0.225     0.162     0.153

julia> m["san-diego", "new-york"]
0.225

julia> m[2,3]
0.153
(基本上,您可以使用名称或整数索引来引用列/行)

还请注意,我将
项转换为
字符串
,但我们也可以将它们保留为
子字符串
s(即在调用中省略
字符串。
部分),但是
字符串
作为
行/列打印时看起来更好一些