## 25. `countValues()`: Summarize a list of years

This function is used by Section 24, “`yearBrackets()`: Display a bracketed list of years worked” to find sequences of years in a list.

cbchistlib.py
```# - - -   c o u n t V a l u e s

def countValues(numberList):
'''Count the number of each value in numberList.

[ numberList is a list of ints order, possibly with some
duplicates ->
return a list of (value, count) pairs in ascending
order by value such that each single value is represented
as (value, 1) and each group of N duplicates is represented
as (value, N) ]
'''
#-- 1
# [ pairList  :=  a new, empty list
#   myList  :=  a copy of numberList, sorted ]
pairList = []
myList = sorted(numberList)
```

In each pass through this loop, we work through `myList`, counting and removing the number of rows that are equal to the first row. Then we add the value and the count to `pairList` and repeat.

cbchistlib.py
```    #-- 2
# [ pairList  +:=  (value, count) pairs representing contiguous
#       groups of equal values in myList
#   myList  :=  empty ]
while len(myList) > 0:
#-- 2 body
# [ myList is a nonempty list ->
#     myList  :=  myList with all initial elements removed
#                 that have the same value
#     pairList  +:=  a pair (myList, c) where c is the
#         number of initial elements with the same value ]
first = myList.pop(0)
count = 1
while ( ( len(myList) > 0 ) and
( first == myList ) ):
count  +=  1
myList.pop(0)
pairList.append ( (first, count) )

#-- 3
return pairList
```