AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 79150296
Accepted
user2138149
user2138149
Asked: 2024-11-02 16:59:02 +0800 CST2024-11-02 16:59:02 +0800 CST 2024-11-02 16:59:02 +0800 CST

Como mesclar um dicionário em Julia?

  • 772

Quero escrever uma função em Julia que mescle dois dicionários.

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

A semântica é a seguinte:

  • As entradas são lefteright
  • Ambos lefte rightassumiram a propriedade de seus dados, o que significa que eles serão modificados após a chamada da função e nenhuma garantia sobre os dados que eles contêm deve ser feita
  • O valor de retorno contém os dados de ambos os dicionários
  • Se alguma chave estiver presente em ambos lefte righto valor de leftfor mantido

Aqui está uma ideia inicial sobre como abordar esse problema. (Este é um pseudocódigo com notas, não algo que realmente será compilado.)

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

Você pode ver que eu tentei escrever uma implementação manual. Tenho quase certeza de que Julia terá algumas funções úteis como parte da biblioteca padrão para implementar isso, no entanto, sendo novo em Julia, não sei o que elas podem ser.

Encontrei as funções merge, mergewith, merge!e , mergewith!no entanto nenhuma delas parece ter a semântica descrita acima.

dictionary
  • 1 1 respostas
  • 27 Views

1 respostas

  • Voted
  1. Best Answer
    user9712582
    2024-11-02T23:16:06+08:002024-11-02T23:16:06+08:00

    As diferenças entre a função desejada e mergea que parece ser

    (1) em caso de conflitos, o dicionário mesclado deve conter o valor do leftdicionário em vez do valor do rightdicionário, e

    (2) deve remover os pares transferidos dos dicionários de entrada.

    Se a mesma chave aparecer em ambos os dicionários, então há uma decisão a ser tomada. Sua função poderia (a) remover os pares de ambos os dicionários, ou (b) remover apenas o par transferido do leftdicionário.

    Para a parte 1, sua função pode chamar as funções Julia. Ou:

    1a: Troque o primeiro e o segundo argumentos para merge, como em merge(right, left). Ou

    1b: Forneça mergewithuma combinefunção que selecione seu primeiro argumento, como em mergewith( (a,b)->a, left, right).

    Para a parte 2, sua função pode

    2a. use empty!em ambas as entradas como em empty!(left)e empty!(right)(se as entradas ambas devem ficar vazias apesar dos conflitos). Ou

    2b. usar empty!(left)e filter!(pair -> pair.first in keys(left), right)(manter chaves conflitantes em rightse rightpares não transferidos para o dicionário mesclado devem permanecer em right)

    (Dica: methodswith(Dict, supertypes=true)lista assinaturas de métodos que aceitam um Dict, incluindo empty!e filter!.)

    Exemplo

    function mergeAndEmpty!(left::Dict, right::Dict)::Dict
        tmp = merge(right, left)
        empty!(left)
        empty!(right)
        return tmp
    end
    
    d1 = Dict("a"=>1, "b"=>2, "c"=>3, "d"=>4)
    d2 = Dict("y"=>10, "z"=>20)
    
    d_out = mergeAndEmpty!(d1, d2)
    
    println(d1) # empty
    println(d2) # empty
    println(d_out) # contains all 6 elements
    
    • 1

relate perguntas

  • Passe o valor do iterador sem parar a iteração

  • É possível usar o índice de um array em um bloco de mapa?

  • Como criar um contador incremental no mulesoft dataweave

  • Como o mapa assume propriedade parcial por meio de uma referência imutável

  • GO, as chaves do mapa estão sendo todas atualizadas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle?

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Quando devo usar um std::inplace_vector em vez de um std::vector?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Martin Hope
    Aleksandr Dubinsky Por que a correspondência de padrões com o switch no InetAddress falha com 'não cobre todos os valores de entrada possíveis'? 2024-12-23 06:56:21 +0800 CST
  • Martin Hope
    Phillip Borge Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle? 2024-12-12 20:46:46 +0800 CST
  • Martin Hope
    Oodini Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores? 2024-12-12 06:27:11 +0800 CST
  • Martin Hope
    sleeptightAnsiC `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso? 2024-11-09 07:18:53 +0800 CST
  • Martin Hope
    The Mad Gamer Quando devo usar um std::inplace_vector em vez de um std::vector? 2024-10-29 23:01:00 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST
  • Martin Hope
    MarkB Por que o GCC gera código que executa condicionalmente uma implementação SIMD? 2024-02-17 06:17:14 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve