Vectorized indexing for a dictionary2019 Community Moderator ElectionNested list comprehensions in JuliaJulia storing a partitioned data frame to a dictionaryAvoid memory allocation when indexing an array in Juliamap, reduce with `|>` in juliaMultiple selection from Julia arrayNested array comprehension in JuliaJulia - using dictionary key as index for a multidimensional arrayConvert Dict to ArrayTuple in JuliaHow to access key-value tuples in forward/reverse order for Dict and SortedDict? - Juliaboolean matching using & operator

Having the player face themselves after the mid-game

What would be the most expensive material to an intergalactic society?

What do you call someone who likes to pick fights?

Proving a statement about real numbers

After `ssh` without `-X` to a machine, is it possible to change `$DISPLAY` to make it work like `ssh -X`?

Street obstacles in New Zealand

Why do we say ‘pairwise disjoint’, rather than ‘disjoint’?

Does a difference of tense count as a difference of meaning in a minimal pair?

Why aren't there more Gauls like Obelix?

School performs periodic password audits. Is my password compromised?

Making a kiddush for a girl that has hard time finding shidduch

Can we track matter through time by looking at different depths in space?

Finitely many repeated replacements

Is it possible to avoid unpacking when merging Association?

Can't make sense of a paragraph from Lovecraft

Which situations would cause a company to ground or recall a aircraft series?

Does an unused member variable take up memory?

I need help with tikz tree node and label, offsets and inclination

What materials can be used to make a humanoid skin warm?

What is this diamond of every day?

Is it possible to find 2014 distinct positive integers whose sum is divisible by each of them?

Would an aboleth's Phantasmal Force lair action be affected by Counterspell, Dispel Magic, and/or Slow?

Outlet with 3 sets of wires

PTIJ: Why does only a Shor Tam ask at the Seder, and not a Shor Mu'ad?



Vectorized indexing for a dictionary



2019 Community Moderator ElectionNested list comprehensions in JuliaJulia storing a partitioned data frame to a dictionaryAvoid memory allocation when indexing an array in Juliamap, reduce with `|>` in juliaMultiple selection from Julia arrayNested array comprehension in JuliaJulia - using dictionary key as index for a multidimensional arrayConvert Dict to ArrayTuple in JuliaHow to access key-value tuples in forward/reverse order for Dict and SortedDict? - Juliaboolean matching using & operator










5















I would like to find a succinct syntax in Julia for indexing a dictionary in a vectorized manner. In R, I would do the following:



dict <- c("a" = 1, "b" = 2)
keys <- c("a", "a", "b", "b", "a")
dict[keys]


In Julia, if I have a dict and keys like this,



dict = Dict(:a => 1, :b => 2)
keys = [:a, :a, :b, :b, :a]


then I can achieve the desired result using a list comprehension:



julia> [dict[key] for key in keys]
5-element ArrayInt64,1:
1
1
2
2
1


Is there a more succinct vectorized syntax, similar to the R syntax?










share|improve this question


























    5















    I would like to find a succinct syntax in Julia for indexing a dictionary in a vectorized manner. In R, I would do the following:



    dict <- c("a" = 1, "b" = 2)
    keys <- c("a", "a", "b", "b", "a")
    dict[keys]


    In Julia, if I have a dict and keys like this,



    dict = Dict(:a => 1, :b => 2)
    keys = [:a, :a, :b, :b, :a]


    then I can achieve the desired result using a list comprehension:



    julia> [dict[key] for key in keys]
    5-element ArrayInt64,1:
    1
    1
    2
    2
    1


    Is there a more succinct vectorized syntax, similar to the R syntax?










    share|improve this question
























      5












      5








      5








      I would like to find a succinct syntax in Julia for indexing a dictionary in a vectorized manner. In R, I would do the following:



      dict <- c("a" = 1, "b" = 2)
      keys <- c("a", "a", "b", "b", "a")
      dict[keys]


      In Julia, if I have a dict and keys like this,



      dict = Dict(:a => 1, :b => 2)
      keys = [:a, :a, :b, :b, :a]


      then I can achieve the desired result using a list comprehension:



      julia> [dict[key] for key in keys]
      5-element ArrayInt64,1:
      1
      1
      2
      2
      1


      Is there a more succinct vectorized syntax, similar to the R syntax?










      share|improve this question














      I would like to find a succinct syntax in Julia for indexing a dictionary in a vectorized manner. In R, I would do the following:



      dict <- c("a" = 1, "b" = 2)
      keys <- c("a", "a", "b", "b", "a")
      dict[keys]


      In Julia, if I have a dict and keys like this,



      dict = Dict(:a => 1, :b => 2)
      keys = [:a, :a, :b, :b, :a]


      then I can achieve the desired result using a list comprehension:



      julia> [dict[key] for key in keys]
      5-element ArrayInt64,1:
      1
      1
      2
      2
      1


      Is there a more succinct vectorized syntax, similar to the R syntax?







      julia






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Mar 7 at 1:38









      clbieganekclbieganek

      714412




      714412






















          4 Answers
          4






          active

          oldest

          votes


















          4














          getindex.(Ref(dict), keys)


          You can wrap it in Ref so you don't need to [] it.






          share|improve this answer






























            3














            Here's a little macro (using the brilliant MacroTools package):



            using MacroTools
            macro vget(ex)
            @capture(ex, dict_.[idxvec_])
            :(map(i->$dict[i], $idxvec)) |> esc
            end


            Then you can:



            d = Dict(:a => 1, :b => 2)
            ks = [:a, :a, :b, :b, :a]

            @vget d.[ks]


            I probably wouldn't want to use that in production code, something like your list comprehension, or a simple map: map(i->d[i], ks), is more readable/explicit/standard, but it is fun :D






            share|improve this answer






























              3














              If you're going to be frequently using the dictionary as a lookup table, then it might be worth creating a closure to use as a lookup function:



              make_lookup(dict) = key -> dict[key] 

              dict = Dict(:a => 1, :b => 2)

              lookup = make_lookup(dict)


              Then you can use lookup in a vectorized fashion:



              julia> keys = [:a, :a, :b, :b, :a];

              julia> lookup.(keys)
              5-element ArrayInt64,1:
              1
              1
              2
              2
              1





              share|improve this answer
































                2














                You can use the vectorized version of getindex:



                julia> getindex.([dict], keys)
                5-element ArrayInt64,1:
                1
                1
                2
                2
                1


                Note that dict is wrapped in an array so that getindex does not attempt to broadcast over the elements of the dictionary:



                julia> getindex.(dict, keys)
                ERROR: ArgumentError: broadcasting over dictionaries and `NamedTuple`s is reserved
                Stacktrace:
                [1] broadcastable(::DictSymbol,Int64) at ./broadcast.jl:615
                [2] broadcasted(::Function, ::DictSymbol,Int64, ::ArraySymbol,1) at ./broadcast.jl:1164
                [3] top-level scope at none:0





                share|improve this answer


















                • 2





                  I think it's preferable to use getindex.((dict,), keys) or getindex.(Ref(dict), keys), since [dict] will allocate an array.

                  – DNF
                  Mar 7 at 9:59










                Your Answer






                StackExchange.ifUsing("editor", function ()
                StackExchange.using("externalEditor", function ()
                StackExchange.using("snippets", function ()
                StackExchange.snippets.init();
                );
                );
                , "code-snippets");

                StackExchange.ready(function()
                var channelOptions =
                tags: "".split(" "),
                id: "1"
                ;
                initTagRenderer("".split(" "), "".split(" "), channelOptions);

                StackExchange.using("externalEditor", function()
                // Have to fire editor after snippets, if snippets enabled
                if (StackExchange.settings.snippets.snippetsEnabled)
                StackExchange.using("snippets", function()
                createEditor();
                );

                else
                createEditor();

                );

                function createEditor()
                StackExchange.prepareEditor(
                heartbeatType: 'answer',
                autoActivateHeartbeat: false,
                convertImagesToLinks: true,
                noModals: true,
                showLowRepImageUploadWarning: true,
                reputationToPostImages: 10,
                bindNavPrevention: true,
                postfix: "",
                imageUploader:
                brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
                contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
                allowUrls: true
                ,
                onDemand: true,
                discardSelector: ".discard-answer"
                ,immediatelyShowMarkdownHelp:true
                );



                );













                draft saved

                draft discarded


















                StackExchange.ready(
                function ()
                StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55034758%2fvectorized-indexing-for-a-dictionary%23new-answer', 'question_page');

                );

                Post as a guest















                Required, but never shown

























                4 Answers
                4






                active

                oldest

                votes








                4 Answers
                4






                active

                oldest

                votes









                active

                oldest

                votes






                active

                oldest

                votes









                4














                getindex.(Ref(dict), keys)


                You can wrap it in Ref so you don't need to [] it.






                share|improve this answer



























                  4














                  getindex.(Ref(dict), keys)


                  You can wrap it in Ref so you don't need to [] it.






                  share|improve this answer

























                    4












                    4








                    4







                    getindex.(Ref(dict), keys)


                    You can wrap it in Ref so you don't need to [] it.






                    share|improve this answer













                    getindex.(Ref(dict), keys)


                    You can wrap it in Ref so you don't need to [] it.







                    share|improve this answer












                    share|improve this answer



                    share|improve this answer










                    answered Mar 7 at 4:37









                    xiaodaixiaodai

                    4,176114871




                    4,176114871























                        3














                        Here's a little macro (using the brilliant MacroTools package):



                        using MacroTools
                        macro vget(ex)
                        @capture(ex, dict_.[idxvec_])
                        :(map(i->$dict[i], $idxvec)) |> esc
                        end


                        Then you can:



                        d = Dict(:a => 1, :b => 2)
                        ks = [:a, :a, :b, :b, :a]

                        @vget d.[ks]


                        I probably wouldn't want to use that in production code, something like your list comprehension, or a simple map: map(i->d[i], ks), is more readable/explicit/standard, but it is fun :D






                        share|improve this answer



























                          3














                          Here's a little macro (using the brilliant MacroTools package):



                          using MacroTools
                          macro vget(ex)
                          @capture(ex, dict_.[idxvec_])
                          :(map(i->$dict[i], $idxvec)) |> esc
                          end


                          Then you can:



                          d = Dict(:a => 1, :b => 2)
                          ks = [:a, :a, :b, :b, :a]

                          @vget d.[ks]


                          I probably wouldn't want to use that in production code, something like your list comprehension, or a simple map: map(i->d[i], ks), is more readable/explicit/standard, but it is fun :D






                          share|improve this answer

























                            3












                            3








                            3







                            Here's a little macro (using the brilliant MacroTools package):



                            using MacroTools
                            macro vget(ex)
                            @capture(ex, dict_.[idxvec_])
                            :(map(i->$dict[i], $idxvec)) |> esc
                            end


                            Then you can:



                            d = Dict(:a => 1, :b => 2)
                            ks = [:a, :a, :b, :b, :a]

                            @vget d.[ks]


                            I probably wouldn't want to use that in production code, something like your list comprehension, or a simple map: map(i->d[i], ks), is more readable/explicit/standard, but it is fun :D






                            share|improve this answer













                            Here's a little macro (using the brilliant MacroTools package):



                            using MacroTools
                            macro vget(ex)
                            @capture(ex, dict_.[idxvec_])
                            :(map(i->$dict[i], $idxvec)) |> esc
                            end


                            Then you can:



                            d = Dict(:a => 1, :b => 2)
                            ks = [:a, :a, :b, :b, :a]

                            @vget d.[ks]


                            I probably wouldn't want to use that in production code, something like your list comprehension, or a simple map: map(i->d[i], ks), is more readable/explicit/standard, but it is fun :D







                            share|improve this answer












                            share|improve this answer



                            share|improve this answer










                            answered Mar 7 at 5:04









                            JobJobJobJob

                            2,4392328




                            2,4392328





















                                3














                                If you're going to be frequently using the dictionary as a lookup table, then it might be worth creating a closure to use as a lookup function:



                                make_lookup(dict) = key -> dict[key] 

                                dict = Dict(:a => 1, :b => 2)

                                lookup = make_lookup(dict)


                                Then you can use lookup in a vectorized fashion:



                                julia> keys = [:a, :a, :b, :b, :a];

                                julia> lookup.(keys)
                                5-element ArrayInt64,1:
                                1
                                1
                                2
                                2
                                1





                                share|improve this answer





























                                  3














                                  If you're going to be frequently using the dictionary as a lookup table, then it might be worth creating a closure to use as a lookup function:



                                  make_lookup(dict) = key -> dict[key] 

                                  dict = Dict(:a => 1, :b => 2)

                                  lookup = make_lookup(dict)


                                  Then you can use lookup in a vectorized fashion:



                                  julia> keys = [:a, :a, :b, :b, :a];

                                  julia> lookup.(keys)
                                  5-element ArrayInt64,1:
                                  1
                                  1
                                  2
                                  2
                                  1





                                  share|improve this answer



























                                    3












                                    3








                                    3







                                    If you're going to be frequently using the dictionary as a lookup table, then it might be worth creating a closure to use as a lookup function:



                                    make_lookup(dict) = key -> dict[key] 

                                    dict = Dict(:a => 1, :b => 2)

                                    lookup = make_lookup(dict)


                                    Then you can use lookup in a vectorized fashion:



                                    julia> keys = [:a, :a, :b, :b, :a];

                                    julia> lookup.(keys)
                                    5-element ArrayInt64,1:
                                    1
                                    1
                                    2
                                    2
                                    1





                                    share|improve this answer















                                    If you're going to be frequently using the dictionary as a lookup table, then it might be worth creating a closure to use as a lookup function:



                                    make_lookup(dict) = key -> dict[key] 

                                    dict = Dict(:a => 1, :b => 2)

                                    lookup = make_lookup(dict)


                                    Then you can use lookup in a vectorized fashion:



                                    julia> keys = [:a, :a, :b, :b, :a];

                                    julia> lookup.(keys)
                                    5-element ArrayInt64,1:
                                    1
                                    1
                                    2
                                    2
                                    1






                                    share|improve this answer














                                    share|improve this answer



                                    share|improve this answer








                                    edited 2 days ago

























                                    answered Mar 7 at 21:16









                                    clbieganekclbieganek

                                    714412




                                    714412





















                                        2














                                        You can use the vectorized version of getindex:



                                        julia> getindex.([dict], keys)
                                        5-element ArrayInt64,1:
                                        1
                                        1
                                        2
                                        2
                                        1


                                        Note that dict is wrapped in an array so that getindex does not attempt to broadcast over the elements of the dictionary:



                                        julia> getindex.(dict, keys)
                                        ERROR: ArgumentError: broadcasting over dictionaries and `NamedTuple`s is reserved
                                        Stacktrace:
                                        [1] broadcastable(::DictSymbol,Int64) at ./broadcast.jl:615
                                        [2] broadcasted(::Function, ::DictSymbol,Int64, ::ArraySymbol,1) at ./broadcast.jl:1164
                                        [3] top-level scope at none:0





                                        share|improve this answer


















                                        • 2





                                          I think it's preferable to use getindex.((dict,), keys) or getindex.(Ref(dict), keys), since [dict] will allocate an array.

                                          – DNF
                                          Mar 7 at 9:59















                                        2














                                        You can use the vectorized version of getindex:



                                        julia> getindex.([dict], keys)
                                        5-element ArrayInt64,1:
                                        1
                                        1
                                        2
                                        2
                                        1


                                        Note that dict is wrapped in an array so that getindex does not attempt to broadcast over the elements of the dictionary:



                                        julia> getindex.(dict, keys)
                                        ERROR: ArgumentError: broadcasting over dictionaries and `NamedTuple`s is reserved
                                        Stacktrace:
                                        [1] broadcastable(::DictSymbol,Int64) at ./broadcast.jl:615
                                        [2] broadcasted(::Function, ::DictSymbol,Int64, ::ArraySymbol,1) at ./broadcast.jl:1164
                                        [3] top-level scope at none:0





                                        share|improve this answer


















                                        • 2





                                          I think it's preferable to use getindex.((dict,), keys) or getindex.(Ref(dict), keys), since [dict] will allocate an array.

                                          – DNF
                                          Mar 7 at 9:59













                                        2












                                        2








                                        2







                                        You can use the vectorized version of getindex:



                                        julia> getindex.([dict], keys)
                                        5-element ArrayInt64,1:
                                        1
                                        1
                                        2
                                        2
                                        1


                                        Note that dict is wrapped in an array so that getindex does not attempt to broadcast over the elements of the dictionary:



                                        julia> getindex.(dict, keys)
                                        ERROR: ArgumentError: broadcasting over dictionaries and `NamedTuple`s is reserved
                                        Stacktrace:
                                        [1] broadcastable(::DictSymbol,Int64) at ./broadcast.jl:615
                                        [2] broadcasted(::Function, ::DictSymbol,Int64, ::ArraySymbol,1) at ./broadcast.jl:1164
                                        [3] top-level scope at none:0





                                        share|improve this answer













                                        You can use the vectorized version of getindex:



                                        julia> getindex.([dict], keys)
                                        5-element ArrayInt64,1:
                                        1
                                        1
                                        2
                                        2
                                        1


                                        Note that dict is wrapped in an array so that getindex does not attempt to broadcast over the elements of the dictionary:



                                        julia> getindex.(dict, keys)
                                        ERROR: ArgumentError: broadcasting over dictionaries and `NamedTuple`s is reserved
                                        Stacktrace:
                                        [1] broadcastable(::DictSymbol,Int64) at ./broadcast.jl:615
                                        [2] broadcasted(::Function, ::DictSymbol,Int64, ::ArraySymbol,1) at ./broadcast.jl:1164
                                        [3] top-level scope at none:0






                                        share|improve this answer












                                        share|improve this answer



                                        share|improve this answer










                                        answered Mar 7 at 1:38









                                        clbieganekclbieganek

                                        714412




                                        714412







                                        • 2





                                          I think it's preferable to use getindex.((dict,), keys) or getindex.(Ref(dict), keys), since [dict] will allocate an array.

                                          – DNF
                                          Mar 7 at 9:59












                                        • 2





                                          I think it's preferable to use getindex.((dict,), keys) or getindex.(Ref(dict), keys), since [dict] will allocate an array.

                                          – DNF
                                          Mar 7 at 9:59







                                        2




                                        2





                                        I think it's preferable to use getindex.((dict,), keys) or getindex.(Ref(dict), keys), since [dict] will allocate an array.

                                        – DNF
                                        Mar 7 at 9:59





                                        I think it's preferable to use getindex.((dict,), keys) or getindex.(Ref(dict), keys), since [dict] will allocate an array.

                                        – DNF
                                        Mar 7 at 9:59

















                                        draft saved

                                        draft discarded
















































                                        Thanks for contributing an answer to Stack Overflow!


                                        • Please be sure to answer the question. Provide details and share your research!

                                        But avoid


                                        • Asking for help, clarification, or responding to other answers.

                                        • Making statements based on opinion; back them up with references or personal experience.

                                        To learn more, see our tips on writing great answers.




                                        draft saved


                                        draft discarded














                                        StackExchange.ready(
                                        function ()
                                        StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55034758%2fvectorized-indexing-for-a-dictionary%23new-answer', 'question_page');

                                        );

                                        Post as a guest















                                        Required, but never shown





















































                                        Required, but never shown














                                        Required, but never shown












                                        Required, but never shown







                                        Required, but never shown

































                                        Required, but never shown














                                        Required, but never shown












                                        Required, but never shown







                                        Required, but never shown







                                        Popular posts from this blog

                                        Can't initialize raids on a new ASUS Prime B360M-A motherboard2019 Community Moderator ElectionSimilar to RAID config yet more like mirroring solution?Can't get motherboard serial numberWhy does the BIOS entry point start with a WBINVD instruction?UEFI performance Asus Maximus V Extreme

                                        Identity Server 4 is not redirecting to Angular app after login2019 Community Moderator ElectionIdentity Server 4 and dockerIdentityserver implicit flow unauthorized_clientIdentityServer Hybrid Flow - Access Token is null after user successful loginIdentity Server to MVC client : Page Redirect After loginLogin with Steam OpenId(oidc-client-js)Identity Server 4+.NET Core 2.0 + IdentityIdentityServer4 post-login redirect not working in Edge browserCall to IdentityServer4 generates System.NullReferenceException: Object reference not set to an instance of an objectIdentityServer4 without HTTPS not workingHow to get Authorization code from identity server without login form

                                        2005 Ahvaz unrest Contents Background Causes Casualties Aftermath See also References Navigation menue"At Least 10 Are Killed by Bombs in Iran""Iran"Archived"Arab-Iranians in Iran to make April 15 'Day of Fury'"State of Mind, State of Order: Reactions to Ethnic Unrest in the Islamic Republic of Iran.10.1111/j.1754-9469.2008.00028.x"Iran hangs Arab separatists"Iran Overview from ArchivedConstitution of the Islamic Republic of Iran"Tehran puzzled by forged 'riots' letter""Iran and its minorities: Down in the second class""Iran: Handling Of Ahvaz Unrest Could End With Televised Confessions""Bombings Rock Iran Ahead of Election""Five die in Iran ethnic clashes""Iran: Need for restraint as anniversary of unrest in Khuzestan approaches"Archived"Iranian Sunni protesters killed in clashes with security forces"Archived