Re: Matching HoldPattern explicitly

*To*: mathgroup at smc.vnet.net*Subject*: [mg85800] Re: Matching HoldPattern explicitly*From*: Albert Retey <awnl at arcor.net>*Date*: Fri, 22 Feb 2008 07:26:09 -0500 (EST)*References*: <fpm6i0$2kc$1@smc.vnet.net>

Hi, > I'm trying to use Mathematica symbols as dictionaries. In particular > if I have (kk[1, 2] = 3; kk[3, 4] = 4;), I'd like a function "keys" > that would accept kk, and return {{1,2},{3,4}}. > > A recipie on http://www.physic.ut.ee/~kkannike/english/prog/mathematica/index.html > suggests to do > > keys[dict_] := Map[#[[1]] /. {HoldPattern[dict[x_]] -> x} &, > DownValues[dict]] > > However, this doesn't quite work (p:HoldPattern[x] doesn't match > "HoldPattern[x]"). Verbatim[HoldPattern[dict... doesn't work because I > need to do a substitution for local dict variable. So my question is > > 1. What's the best way to match HoldPattern explicitly, while allowing > for local variable substitutions inside "HoldPattern" pattern This gives the keys for the above case: keys[dict_]:=Replace[ DownValues[dict][[All,1]], Verbatim[HoldPattern][dict[x__]]->{x}, {1} ] Note that Verbatim is wrapped around HoldPattern only and that you need two _ in the pattern x__, otherwise you can not find your keys because they are sequences. > 2. What is the best way of implementing Python like dictionaries in > Mathematica? I would not consider these really "Python like" but for most practical purposes using the downvalues of symbols works quite well. One of the differences is that Mathematica-Sequences and Pyhton tuples are not exactly the same, as you have seen in the above. Other than that, a list of rules comes to mind as an alternative data structure to store key-value pairs in mathematica: kk = {{1,2}->3,{3,4}->4} of course accessing the values looks very different and which approach is more suitable depends a lot on what you try to achieve... hth, albert