1, "b" => 2, "c" => 3, "d" => 4, -6ren">
gpt4 book ai didi

dictionary - 如何在 Julia 中使用带有复杂字典键的 husky() 和 in() 函数?

转载 作者:IT王子 更新时间:2023-10-29 00:49:24 27 4
gpt4 key购买 nike

haskey() 和 in() 函数对于测试 Julia 中字典的内容非常有用:

julia> dict = Dict("a" => 1, "b" => 2, "c" => 3, "d" => 4, "e" => 5)
Dict{String,Int64} with 5 entries:
"c" => 3
"e" => 5
"b" => 2
"a" => 1
"d" => 4

julia> haskey(dict, "a")
true

julia> in(("a" => 1), dict)
true

但我对他们使用复杂键的行为感到惊讶:

julia> immutable MyT
A::String
B::Int64
end

julia> a = Dict(MyT("Tom",191)=>1,MyT("Bob",20)=>1,MyT("Jo",315)=>1,MyT("Luc",493)=>1)
Dict{MyT,Int64} with 4 entries:
MyT("Tom",191) => 1
MyT("Jo",315) => 1
MyT("Bob",20) => 1
MyT("Luc",493) => 1

julia> keys(a)
Base.KeyIterator for a Dict{MyT,Int64} with 4 entries. Keys:
MyT("Tom",191)
MyT("Jo",315)
MyT("Bob",20)
MyT("Luc",493)

julia> haskey(a, MyT("Tom",191))
false

julia> in((MyT("Tom",191) => 1), a)
false

我做错了什么?非常感谢您的意见!

感谢@Michael K. Borregaard,我可以提出这个解决方案:

a = Dict{MyT, Int64}()

keyArray = Array{MyT,1}()
keyArray = [MyT("Tom",191),MyT("Bob",20),MyT("Jo",315),MyT("Luc",493)]

for i in keyArray
a[i] = 1
end

println(a)
# Dict(MyT("Tom",191)=>1,MyT("Tom",191)=>1,MyT("Luc",493)=>1,MyT("Jo",315)=>1,MyT("Luc",493)=>1,MyT("Bob",20)=>1,MyT("Jo",315)=>1,MyT("Bob",20)=>1)

keyArray[1] # MyT("Tom",191)
haskey(a, keyArray[1]) # true

但我必须将键存储在一个单独的数组中。这意味着不能保证键的唯一性,这是字典的优势,也是我选择使用它的原因:(

所以我必须使用另一个步骤:

unique(keyArray)

另一个更好的解决方案:

function CompareKeys(k1::MyT, k2::MyT)
if k1.A == k2.A && k1.B == k2.B
return true
else
return false
end
end

function ExistKey(k::MyT, d::Dict{MyT, Int64})
for i in keys(d)
if CompareKeys(k, i)
return true
end
end
return false
end

a = Dict(MyT("Tom",191)=>1,MyT("Bob",20)=>1,MyT("Jo",315)=>1,MyT("Luc",493)=>1)

ExistKey(MyT("Tom",192),a) # false

ExistKey(MyT("Tom",191),a) # true

与 Julia 相比,Go 对于这个问题更直接:

package main

import (
"fmt"
)

type MyT struct {
A string
B int
}

func main() {

dic := map[MyT]int{MyT{"Bob", 10}: 1, MyT{"Jo", 21}: 1}

if _, ok := dic[MyT{"Bob", 10}]; ok {
fmt.Println("key exists")
}
}
// answer is "key exists"

最佳答案

您只需要告诉您的 MyT 类型您希望它在复合字段方面考虑平等:

julia> immutable MyT
A::String
B::Int64
end
import Base: ==, hash
==(x::MyT, y::MyT) = x.A == y.A && x.B == y.B
hash(x::MyT, h::UInt) = hash(x.A, hash(x.B, hash(0x7d6979235cb005d0, h)))

julia> a = Dict(MyT("Tom",191)=>1,MyT("Bob",20)=>1,MyT("Jo",315)=>1,MyT("Luc",493)=>1)
Dict{MyT,Int64} with 4 entries:
MyT("Jo", 315) => 1
MyT("Luc", 493) => 1
MyT("Tom", 191) => 1
MyT("Bob", 20) => 1

julia> haskey(a, MyT("Tom",191))
true

julia> in((MyT("Tom",191) => 1), a)
true

关于dictionary - 如何在 Julia 中使用带有复杂字典键的 husky() 和 in() 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44324800/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com