为什么将大型字典从 python 传递给 julia flatten 包含多维列表?

Why does passing a large dictionary from python to julia flatten contained multidimensional lists?

好的...我正在为我玩的编码游戏创建一个 python 客户端。该游戏最初创建于 javascript,并使用了在 https://adventure.land/data.js 中找到的 json 游戏数据对象。在这个数据中,每个地图都有一个门列表,这个列表中的每个门都是一个属性列表。例如:

"doors":[[-965,-176,24,30,"woffice",0,1],[536,1665,64,32,"tunnel",0,2],[168,-149,32,40,"bank",0,3],[160,1370,24,32,"cave",0,4],[232,384,24,30,"arena",0,6],[-472,131,24,30,"tavern",0,8],[616,610,32,40,"mansion",0,10],[1936,-23,24,24,"level1",1,11],[169,-404,24,40,"hut",0,14],[1600,-547,60,40,"halloween",4,15],[312,-335,32,32,"mtunnel",0,16],[967,-584,32,32,"mtunnel",1,17],[1472,-434,32,32,"mtunnel",2,18]]

但是,从python发送给julia时,突然变成了:

"doors":[-965,-176,24,30,"woffice",0,1,536,1665,64,32,"tunnel",0,2,168,-149,32,40,"bank",0,3,160,1370,24,32,"cave",0,4,232,384,24,30,"arena",0,6,-472,131,24,30,"tavern",0,8,616,610,32,40,"mansion",0,10,1936,-23,24,24,"level1",1,11,169,-404,24,40,"hut",0,14,1600,-547,60,40,"halloween",4,15,312,-335,32,32,"mtunnel",0,16,967,-584,32,32,"mtunnel",1,17,1472,-434,32,32,"mtunnel",2,18]

有什么方法可以防止这种情况发生吗?如果没有,是否有可能的解决方法?因为考虑到随机列表扁平化,我在 python 中的 for door in doors 代码在直接转换为 julia 时不会完全具有相同的效果。

编辑:有人要求我提供“最小可重现代码”,但我不太确定最小值是多少,所以我只想说...

  1. 在 julia 中创建一个打印字典的函数
function printDict(d)
    println(d)
end
  1. 在 python 中创建包含嵌套列表的字典
nestedlistdict = {"data": [[0,1,2,3],[4,5,6,7]]}
  1. 从 python 调用 printDict 函数,同时发送 nestedlistdict 变量作为参数
from julia import Main
Main.include("path/to/your/julia/file")
Main.file.printDict(nestedlistdict)
  1. 结果应该是: Dict{Any, Any}("data" => [[0, 1, 2, 3], [4, 5, 6, 7]])但我的结果是 Dict{Any, Any}("data" => [0 1 2 3; 4 5 6 7])

Edit2:经过进一步测试,它似乎有问题,因为它将嵌套列表转换为 Matrix 对象而不是嵌套 Vector 对象。

Julia 使用与 numpy 相同的列表列表解释:

>>> np.array([[1,2,3],[4,5,6]])
array([[1, 2, 3],
       [4, 5, 6]])

或朱莉娅:

julia> using PyCall

julia> py"[[1,2,3],[4,5,6]]"
2×3 Matrix{Int64}:
 1  2  3
 4  5  6

如果你想要一个实际的向量向量,你需要像你需要做一个 numpy 数组的向量一样的方法。 Python 版本:

>>> [np.array([1,2,3]),np.array([1,2,3])]
[np.array([1, 2, 3]), np.array([1, 2, 3])]

Julia 版本(这是您实际要求的):

julia> np = pyimport("numpy");

julia> py"[$np.array([1, 2, 3]), $np.array([1, 2, 3])]"
2-element Vector{Vector{Int32}}:
 [1, 2, 3]
 [1, 2, 3]

另一个可能更简单的选择是将所有内容打包到一个元组中:

julia> py"tuple([[1,2,3],[4,5,6]])"
([1, 2, 3], [4, 5, 6])