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

                                        Thal And Out Agency railway station See also References External links Navigation menuOfficial Web Site of Pakistan RailwaysArchivedOfficial Web Site of Pakistan Railwayseeexpanding ite

                                        Understanding generators in Python2019 Community Moderator ElectionGenerator function not working pythonFor loop not executing two timesGenerators - Printing generated valuesWhy can a python generator only be used once?What exactly do generators do?What does the “yield” keyword do?What does “list comprehension” mean? How does it work and how can I use it?sklearn Kfold acces single fold instead of for loopIs a generator the callable? Which is the generator?Apply Border To Range Of Cells Using OpenpyxlCalling an external command in PythonWhat are metaclasses in Python?What is the difference between @staticmethod and @classmethod?Finding the index of an item given a list containing it in PythonDifference between append vs. extend list methods in PythonHow can I safely create a nested directory in Python?Does Python have a ternary conditional operator?Understanding slice notationUnderstanding Python super() with __init__() methodsDoes Python have a string 'contains' substring method?

                                        How can I change the color of pagination dots of UIPageControl?How to change UIPageControl dotsIs there a way to change page indicator dots colorCustomize dot with image of UIPageControl at index 0 of UIPageControlNo visible @interface for 'NSObject<PageControlDelegate>' declares the selector 'pageControlPageDidChange:'How to change the color of pagination dots in UIPageControl with a different color per pagepagecontrol indicator custom image instead of DefaultChanging the colour of UIPageControl dots in MonoTouchpagecontrol selectable page visibility color?Alternative way to load ViewControllers on a UIPageControlHow to set only layer.border-color for UIpage control dots in swiftHow can I develop for iPhone using a Windows development machine?How to change the name of an iOS app?UITableView - change section header coloruipagecontrol indicator(dot)issueCustom UIPageControl dots color not changingchange the interspace between UIPageControl dotsHow to change Status Bar text color in iOSHow can I change image tintColor in iOS and WatchKitUIPageControl dots with larger space in between each dotsHow to change the color of pagination dots in UIPageControl with a different color per page