代码之家  ›  专栏  ›  技术社区  ›  Pigna

嵌套dict中的非理性方法错误?

  •  1
  • Pigna  · 技术社区  · 10 年前

    在将一个程序从python翻译为julia时,我偶然发现了这个错误,我无法理解。下面是代码片段的简化:

    a = Dict()
    for x in 1:3
       a[x] = Dict((x,) => 1//1)     #the keys of the nested dicts must all be tuples
       println("Insert numbers for "$(x)": ")
       for y in 1:3
           while !(haskey(a[x],(y,)))
               print("$((y,)): ")
               a[x][y] = rationalize(convert(Float64,eval(parse(readline(STDIN)))))
           end
       end
    end
    

    当我运行这个时,我得到:

    ERROR: MethodError: `convert` has no method matching convert(::Type{Tuple{Int64}}, ::Int64)
    

    这对我来说似乎很荒谬,因为我没有将int转换为元组,而是将Numeric转换为Rational,然后将其分配给一个恰好是元组的键。 这种行为的原因是什么?

    1 回复  |  直到 10 年前
        1
  •  4
  •   Gomiero    10 年前

    尝试转换时出错 y ( Int64 )到 薄纱 类型

    您可以将其更改为 (y,) :

    a[x][(y,)] = rationalize(convert(Float64,eval(parse(readline(STDIN)))))
    

    更改此行后,执行将给出以下输出:

    Insert numbers for 1:
    (2,): 2.3
    (3,): 4//5
    Insert numbers for 2:
    (1,): 9/7
    (3,): 3.141592653
    Insert numbers for 3:
    (1,): 3.33333
    (2,): 2
    

    并添加 dump(a) 在代码末尾,输出:

    Dict{Any,Any} len 3
      2: Dict{Tuple{Int64},Rational{Int64}} len 3
        (3,): Rational{Int64}
          num: Int64 199345706
          den: Int64 63453709
        (2,): Rational{Int64}
          num: Int64 1
          den: Int64 1
        (1,): Rational{Int64}
          num: Int64 9
          den: Int64 7
      3: Dict{Tuple{Int64},Rational{Int64}} len 3
        (3,): Rational{Int64}
          num: Int64 1
          den: Int64 1
        (2,): Rational{Int64}
          num: Int64 2
          den: Int64 1
        (1,): Rational{Int64}
          num: Int64 333333
          den: Int64 100000
      1: Dict{Tuple{Int64},Rational{Int64}} len 3
        (3,): Rational{Int64}
          num: Int64 4
          den: Int64 5
        (2,): Rational{Int64}
          num: Int64 23
          den: Int64 10
        (1,): Rational{Int64}
          num: Int64 1
          den: Int64 1
    

    还有一件事是第一件事 println 。也许应该是:

    println("Insert numbers for $(x): ")
    

    用Julia版本0.4.3测试