Re: Difficulty with patterns
- To: mathgroup at smc.vnet.net
- Subject: [mg122315] Re: Difficulty with patterns
- From: A Retey <awnl at gmx-topmail.de>
- Date: Tue, 25 Oct 2011 06:15:44 -0400 (EDT)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
- References: <j80qbl$ae1$1@smc.vnet.net>
Hi,
> I have recently become increasingly uncomfortable with my areas of
> ignorance with Mathematica. The Virtual conference has some really
> cool demos. In one, a website is read in and a table of data
> extracted. Without patterns, it would have been very difficult.
> Need a little help with an example.
>
> Example 1 uses my old standby, the Table[] function. Works fine. I
> am attempting to get better with patterns, so I tried example 2 and
> 3. They work, but gives several errors about use of stringjoin
> needing strings. What am I doing wrong?
>
> Error: StringJoin::string: String expected at position 1 in
> StringJoin[n].
>
> (* Load string from WolframAlpha *) m
> WolframAlpha["usa",{{"LargestCities:CountryData",1},"ComputableData"},
>PodStates->
> {"LargestCities:CountryData__More","LargestCities:CountryData__More"}
> ];
>
> (* example 1 *) mNew=Flatten[m,1]; mNew=Drop[mNew,1];
> mNew=Drop[mNew,-1]; mNew=Table[{i[[1,1]]<> i[[1,2]]<> i[[1,2]]
> ,i[[2]]},{i,mNew}]; Grid[mNew,Frame->All]
>
> (* example 2 *) Clear[n,o,p,q]; mNew=Cases[m,
> {{n_String,o_String,p_String},q_} -> { n<> ", "<> o<> ", "<>
> p,q},Infinity ]; Grid[mNew,Frame->All]
>
> (* example 3 *) Clear[n,o,p,q]; mNew=Cases[m, {{n_,o_,p_},q_} -> { n
> , ", ", o , ", ", p,q},Infinity ]; mNew = mNew /. {n___,q_Integer}
> -> {StringJoin[n],q}; Grid[mNew,Frame->All]
>
> I even tried, mNew = Flatten[m, 1]; mNew = Drop[mNew, 1]; mNew =
> Drop[mNew, -1]; mNew = Table[{Head[i[[1, 1]]], Head[i[[1, 2]]], Head[
> i[[1, 2]]] , i[[2]]}, {i, mNew}]; (*mNew=Table[{i[[1,1]]<>
> i[[1,2]]<> i[[1,2]] ,i[[2]]},{i,mNew}];*) Grid[mNew, Frame -> All]
>
> They are all strings!
that's not the problem, also you problem is not with patterns but with
evaluation: when using -> (Rule) the RHS is evaluated before the pattern
matching actually is started. The error message comes from
string-joining the symbols n,o, and p. You want the RHS only to be
evaluated when the pattern matches, so you will need RuleDelayed (:>)
and all is good, e.g. for example 2:
Clear[n, o, p, q];
mNew = Cases[
m, {{n_String, o_String, p_String},
q_} :> {n <> ", " <> o <> ", " <> p, q}, Infinity];
Grid[mNew, Frame -> All]
hth,
albert