I rather like your second solution. It's faster than mine, and sorts the items for free too!
Well done! Louis > On 6 Jul 2017, at 23:54, Ala'a Mohammad <amal...@gmail.com> wrote: > > Oops, the second solution should be > > (1+c[x]) ⊂ s[x←⍋c] > > Ala'a > >> On Fri, Jul 7, 2017 at 1:38 AM, Ala'a Mohammad <amal...@gmail.com> wrote: >> Hi, >> Another two ways, Not as compact or optimized, but generate the same output >> 1) >> G groups, C categories, and S strings >> >> G←(⍴∪C)⍴⊂⍬ ◊ C {G[⍺]←⊂(⊃G[⍺]),⊂⍵}¨S ◊ G >> >> I forgot how to suppress the middle output >> or in a function >> >> ∇ groups ← categories group items >> groups ← (⍴∪categories)⍴⊂⍬ >> categories {groups[⍺]←⊂(⊃groups[⍺]),⊂⍵}¨ items >> >> 2) >> (1+C[x]) ⊂ S[(⍳⍴C)[x←⍋C]] >> >> Best wishes, >> >> Ala'a >> >>> On Wed, Jul 5, 2017 at 2:48 PM, Louis de Forcrand <ol...@bluewin.ch> wrote: >>> Is it important that they be grouped in the order specified by the key? >>> If not, this should do (with C the categories and S the strings): >>> >>> (⊂[1]C∘.=∪C)/¨⊂S >>> >>> If they must be ordered, then this can do it: >>> >>> (⊂[1]C∘.=U[⍋U←∪C])/¨⊂S >>> >>> In addition, the categories don’t have to be numbers. >>> >>> Note that Dyalog’s (dyadic) key function is equivalent to this, with L being >>> the operator’s left operand: >>> >>> L¨(⊂[1]C∘.=∪C)/¨⊂S >>> >>> Cheers, >>> Louis >>> >>> On 05 Jul 2017, at 11:43, Elias Mårtenson <loke...@gmail.com> wrote: >>> >>> I have a list of strings, and a corresponding set of categorisations: >>> >>> strings ← 'foo' 'bar' 'abc' 'def' 'ghi' 'jkl' >>> categories ← 1 1 0 2 1 0 >>> >>> I now need to group these strings according to category. In other words, >>> when applying operation X, I need the following output: >>> >>> categories X strings >>> ┏→━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ >>> ┃┏→━━━━━━━━━━┓ ┏→━━━━━━━━━━━━━━━━┓ ┏→━━━━┓┃ >>> ┃┃"abc" "jkl"┃ ┃"foo" "bar" "hgi"┃ ┃"def"┃┃ >>> ┃┗∊━━━━━━━━━━┛ ┗∊━━━━━━━━━━━━━━━━┛ ┗∊━━━━┛┃ >>> ┗∊∊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ >>> >>> What is the best way to solve this? >>> >>>