A bookseller has lots of books classified in 26 categories labeled A, B, … Z. Each book has a code c of 3, 4, 5 or more characters. The 1st character of a code is a capital letter which defines the book category.

In the bookseller’s stocklist each code c is followed by a space and by a positive integer n (int n >= 0) which indicates the quantity of books of this code in stock.

For example an extract of a stocklist could be:

`L = {"ABART 20", "CDXEF 50", "BKWRK 25", "BTSQZ 89", "DRTYM 60"}.` or `L = ["ABART 20", "CDXEF 50", "BKWRK 25", "BTSQZ 89", "DRTYM 60"] or ....` You will be given a stocklist (e.g. : L) and a list of categories in capital letters e.g :

`M = {"A", "B", "C", "W"} ` or `M = ["A", "B", "C", "W"] or ...` and your task is to find all the books of L with codes belonging to each category of M and to sum their quantity according to each category.

For the lists L and M of example you have to return the string:

`(A : 20) - (B : 114) - (C : 50) - (W : 0)` where A, B, C, W are the categories, 20 is the sum of the unique book of category A, 114 the sum corresponding to “BKWRK” and “BTSQZ”, 50 corresponding to “CDXEF” and 0 to category ‘W’ since there are no code beginning with W.

If `L` or `M` are empty return string is “”.

Notes:

• In the result codes and their values are in the same order as in M.
• See “Samples Tests” for the return.

## The Solution in Python

### Option 1

 `````` 1 2 3 4 5 6 7 8 9 10 11 12 13 `````` ``````def stock_list(listOfArt, listOfCat): if (len(listOfArt) == 0) or (len(listOfCat) == 0): return "" result = "" for cat in listOfCat: total = 0 for book in listOfArt: if (book[0] == cat[0]): total += int(book.split(" ")[1]) if (len(result) != 0): result += " - " result += "(" + str(cat) + " : " + str(total) + ")" return result ``````

### Option 2

 `````` 1 2 3 4 5 6 7 8 9 10 `````` ``````from collections import Counter def stock_list(listOfArt, listOfCat): if not listOfArt: return '' codePos = listOfArt[0].index(' ') + 1 cnt = Counter() for s in listOfArt: cnt[s[0]] += int(s[codePos:]) return ' - '.join('({} : {})'.format(cat, cnt[cat]) for cat in listOfCat) ``````

### Option 3

 ``````1 2 3 4 5 6 7 8 `````` ``````def stock_list(stocklist, categories): if not stocklist or not categories: return "" return " - ".join( "({} : {})".format( category, sum(int(item.split()[1]) for item in stocklist if item[0] == category)) for category in categories) ``````

## Test cases to validate the solution

 `````` 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 `````` ``````from solution import stock_list import test @test.describe("Testing") def _(): @test.it("Tests") def _(): b = ["BBAR 150", "CDXE 515", "BKWR 250", "BTSQ 890", "DRTY 600"] c = ["A", "B", "C", "D"] test.assert_equals(stock_list(b, c), "(A : 0) - (B : 1290) - (C : 515) - (D : 600)") b = ["ABAR 200", "CDXE 500", "BKWR 250", "BTSQ 890", "DRTY 600"] c = ["A", "B"] test.assert_equals(stock_list(b, c), "(A : 200) - (B : 1140)") b = ["CBART 20", "CDXEF 50", "BKWRK 25", "BTSQZ 89", "DRTYM 60"] c = ["A", "B", "C", "W"] test.assert_equals(stock_list(b, c), "(A : 0) - (B : 114) - (C : 70) - (W : 0)") b = ["ROXANNE 102", "RHODODE 123", "BKWRKAA 125", "BTSQZFG 239", "DRTYMKH 060"] c = ["B", "R", "D", "X"] test.assert_equals(stock_list(b, c), "(B : 364) - (R : 225) - (D : 60) - (X : 0)") b = [] c = ["B", "R", "D", "X"] test.assert_equals(stock_list(b, c), "") b = ["ROXANNE 102", "RHODODE 123", "BKWRKAA 125", "BTSQZFG 239", "DRTYMKH 060"] c = [] test.assert_equals(stock_list(b, c), "") b = ["ROXANNE 102", "RHODODE 123", "BKWRKAA 125", "BTSQZFG 239", "DRTYMKH 060"] c = ["U", "V", "R"] test.assert_equals(stock_list(b, c), "(U : 0) - (V : 0) - (R : 225)") ``````