如何在 Julia 中合并字典?

问题描述 投票:0回答:1

我想在 Julia 中编写一个函数来合并两个字典。

function merge(left::Dict, right::Dict)::Dict

语义如下:

  • 输入为
    left
    right
  • left
    right
    都拥有其数据的所有权,这意味着它们将在函数调用后被修改,并且不保证它们包含的数据
  • 返回值包含两个字典中的数据
  • 如果
    left
    right
    中都存在任何键,则
    left
    中的值将被保留

以下是有关如何解决此问题的一些初步想法。 (这是带注释的伪代码,不是实际可以编译的东西。)

function mergeDict(left::Dict, right::Dict)::Dict

    # create a new dictionary from `left`
    return_value = left

    # move data from `right` to `left`, "no-clobber"
    for k, v in pop_next!(right)
    # the function `pop_next!` does not exist, no iterator-like `pop!`

    for k in keys(right)
        v = pop!(right, k)
        # does this work as expected? destructive operation while reading keys?
        # `keys()` returns an *iterator*, not a collection! (?)

        if !haskey(left, k)
            push!(left, k, v) # no `push!` function
            left[k] = v # this works instead
        end
    end
    
    # `left` and `right` are not pointers, but "copy-by-value references"
    # just as in Python, so this doesn't work
    left = nothing
    right = nothing

    # we want to invalidate the data, how to do that?
    # this also won't work because `left` references the same data
    # structure as `return_value`
    clear(left)
    clear(right)
end

您可以看到我尝试编写手动实现。我相当确定 Julia 将会有一些有用的函数作为标准库的一部分来实现这一点,但是对于 Julia 来说,我不知道这些函数可能是什么。

我找到了函数

merge
mergewith
merge!
mergewith!
,但是这些函数似乎都不具有上述语义。

dictionary julia
1个回答
0
投票

您想要的功能和

merge
之间的差异似乎是

(1) 如果发生冲突,合并的字典应包含

left
字典中的值,而不是
right
字典中的值,并且

(2) 它应该从输入字典中删除传输的对。

如果两个字典中都出现相同的键,则需要做出决定。 您的函数可以 (a) 从两个字典中删除对,或 (b) 仅删除从

left
字典中传输的对。

对于第 1 部分,您的函数可以调用 Julia 函数。要么:

1a:将第一个和第二个参数交换为

merge
,如
merge(right, left)
所示。或者

1b:提供

mergewith
一个
combine
函数来选择其第一个参数,如
mergewith( (a,b)->a, left, right)
中所示。

对于第 2 部分,您的函数可以

2a。在两个输入上使用

empty!
,如
empty!(left)
empty!(right)
(如果尽管存在冲突,两个输入都应变为空)。 或者

2b。使用

empty!(left)
filter!(pair -> pair.first in keys(left), right)
(如果未传输到合并字典的
right
对应保留在
right
中,则将冲突的键保留在
right
中)

(提示:

methodswith(Dict)
列出了接受
Dict
的方法的签名,包括
empty!
filter!
。)

© www.soinside.com 2019 - 2024. All rights reserved.