In [1]:
import csv

def sumEveryColumn(filename: str) -> dict[str, float]:
    sums = {}
    with open(filename) as ifh:
        csvRdr = csv.DictReader(ifh)
        for row in csvRdr:
            for key in row:
                if not (key in sums):
                    sums[key] = 0.0
                sums[key] = sums[key] + float(row[key])
    return sums

print(sumEveryColumn("nino34.csv"))
{'YR': 1806525.0, 'MON': 5895.0, 'TOTAL': 24457.69000000002, 'ClimAdjust': 24447.470000000038, 'ANOM': 10.119999999999987}
In [4]:
def averageOf(l: list[float]) -> float:
    sum = 0.0
    for val in l:
        sum = sum + val
    return sum / len(l)

measurements: dict[int, list[float]] = {}
for m in range(1, 13):
    measurements[m] = []
with open("nino34.csv") as ninoCSV:
    nino = csv.DictReader(ninoCSV)
    for row in nino:
        measurements[int(row["MON"])].append(
            float(row["TOTAL"])
        )
averages = {}
for m in range(1, 13):
    averages[m] = averageOf(measurements[m])
print(averages)
{1: 26.423421052631568, 2: 26.637631578947378, 3: 27.146973684210526, 4: 27.594342105263152, 5: 27.70052631578947, 6: 27.51947368421052, 7: 27.088157894736838, 8: 26.671973684210535, 9: 26.557894736842115, 10: 26.532266666666672, 11: 26.52293333333333, 12: 26.4624}
In [8]:
with open("nino34.csv") as ninoCSV:
    nino = csv.DictReader(ninoCSV)
    fieldnames = list(nino.fieldnames or [])
    print(fieldnames)
['YR', 'MON', 'TOTAL', 'ClimAdjust', 'ANOM']
In [10]:
with open("nino34.csv") as ninoCSV:
    nino = csv.reader(ninoCSV)
    for row in nino:
        print(row[2])
TOTAL
24.56
25.07
25.88
26.29
26.19
26.47
26.28
25.88
25.73
25.68
25.46
25.29
25.26
25.72
26.91
27.59
27.93
27.73
27.59
27.01
27.22
27.2
27.25
26.92
26.67
26.75
27.19
27.81
27.79
27.18
26.52
26.3
26.35
26.25
25.92
26.21
26.74
27
27.57
28.03
28.28
28.12
27.42
26.93
27
26.87
26.88
---------------------------------------------------------------------------
KeyboardInterrupt                         Traceback (most recent call last)
Input In [10], in <cell line: 1>()
      2 nino = csv.reader(ninoCSV)
      3 for row in nino:
----> 4     print(row[2])

File /mnt/zfs/jupyter-p03/home/gkrichar/.ipython/profile_default/startup/cs114-setup.py:5, in print(*args, **kwargs)
----> 5 def print(*args, **kwargs): builtins.print(*args, **kwargs); sys.stdout.flush(); time.sleep(0.04)

KeyboardInterrupt: 
In [13]:
def reverseLines(outputFile: str, inputFile: str) -> None:
    # with (open(outputFile, "w"), open(inputFile)) as (o, i):
    with open(outputFile, "w") as o:
        with open(inputFile) as i:
            for line in i:
                o.write(line.strip()[::-1] + "\n")
                
reverseLines("cities-backwards.txt", "a-tale-of-two-cities.txt")
In [14]:
print("Hello", 42, [1, 2, 3])
Hello 42 [1, 2, 3]
In [16]:
def lineInfo(outputFile: str, inputFile: str) -> None:
    with open(outputFile, "w") as o:
        with open(inputFile) as i:
            for line in i:
                line = line.strip()
                o.write(f"Line length: {len(line)}. Line palindrome: {line}{line[::-1]}\n")
                
lineInfo("cities-info.txt", "a-tale-of-two-cities.txt")
In [19]:
with open("nino34.csv") as ifh:
    nino = csv.DictReader(ifh)
    fieldnames = list(nino.fieldnames or [])
    fieldnames.append("Fahrenheit")
    with open("nino34f.csv", "w") as ofh:
        ninoF = csv.DictWriter(ofh, fieldnames)
        ninoF.writeheader()
        
        for row in nino:
            row["Fahrenheit"] = (
                float(row["TOTAL"]) * 9/5+32
            )
            ninoF.writerow(row)
In [23]:
import json

with open("exercise-l13s2.ipynb") as ifh:
    ipynb = json.load(ifh)
print(ipynb["cells"][0]["source"])
ipynb["cells"][0]["source"] = [
    "print('Hello, world!')"
]
with open("output.ipynb", "w") as ofh:
    json.dump(ipynb, ofh)
['import csv\n', '\n', 'def sumEveryColumn(filename: str) -> dict[str, float]:\n', '    sums = {}\n', '    with open(filename) as ifh:\n', '        csvRdr = csv.DictReader(ifh)\n', '        for row in csvRdr:\n', '            for key in row:\n', '                if not (key in sums):\n', '                    sums[key] = 0.0\n', '                sums[key] = sums[key] + float(row[key])\n', '    return sums\n', '\n', 'print(sumEveryColumn("nino34.csv"))']
In [24]:
with open("nino34.ssv") as ifh:
    nino = csv.DictReader(ifh, delimiter=" ")
    for row in nino:
        print(row)
{'YR': '1950', 'MON': '1', 'TOTAL': '24.56', 'ClimAdjust': '26.18', 'ANOM': '-1.62'}
{'YR': '1950', 'MON': '2', 'TOTAL': '25.07', 'ClimAdjust': '26.39', 'ANOM': '-1.32'}
{'YR': '1950', 'MON': '3', 'TOTAL': '25.88', 'ClimAdjust': '26.95', 'ANOM': '-1.07'}
{'YR': '1950', 'MON': '4', 'TOTAL': '26.29', 'ClimAdjust': '27.39', 'ANOM': '-1.11'}
{'YR': '1950', 'MON': '5', 'TOTAL': '26.19', 'ClimAdjust': '27.56', 'ANOM': '-1.37'}
{'YR': '1950', 'MON': '6', 'TOTAL': '26.47', 'ClimAdjust': '27.21', 'ANOM': '-0.74'}
{'YR': '1950', 'MON': '7', 'TOTAL': '26.28', 'ClimAdjust': '26.72', 'ANOM': '-0.44'}
{'YR': '1950', 'MON': '8', 'TOTAL': '25.88', 'ClimAdjust': '26.3', 'ANOM': '-0.42'}
{'YR': '1950', 'MON': '9', 'TOTAL': '25.73', 'ClimAdjust': '26.14', 'ANOM': '-0.41'}
{'YR': '1950', 'MON': '10', 'TOTAL': '25.68', 'ClimAdjust': '26.01', 'ANOM': '-0.32'}
{'YR': '1950', 'MON': '11', 'TOTAL': '25.46', 'ClimAdjust': '26.06', 'ANOM': '-0.6'}
{'YR': '1950', 'MON': '12', 'TOTAL': '25.29', 'ClimAdjust': '26.18', 'ANOM': '-0.88'}
{'YR': '1951', 'MON': '1', 'TOTAL': '25.26', 'ClimAdjust': '26.18', 'ANOM': '-0.92'}
{'YR': '1951', 'MON': '2', 'TOTAL': '25.72', 'ClimAdjust': '26.39', 'ANOM': '-0.66'}
{'YR': '1951', 'MON': '3', 'TOTAL': '26.91', 'ClimAdjust': '26.95', 'ANOM': '-0.04'}
{'YR': '1951', 'MON': '4', 'TOTAL': '27.59', 'ClimAdjust': '27.39', 'ANOM': '0.2'}
{'YR': '1951', 'MON': '5', 'TOTAL': '27.93', 'ClimAdjust': '27.56', 'ANOM': '0.37'}
{'YR': '1951', 'MON': '6', 'TOTAL': '27.73', 'ClimAdjust': '27.21', 'ANOM': '0.52'}
{'YR': '1951', 'MON': '7', 'TOTAL': '27.59', 'ClimAdjust': '26.72', 'ANOM': '0.87'}
{'YR': '1951', 'MON': '8', 'TOTAL': '27.01', 'ClimAdjust': '26.3', 'ANOM': '0.71'}
{'YR': '1951', 'MON': '9', 'TOTAL': '27.22', 'ClimAdjust': '26.14', 'ANOM': '1.08'}
{'YR': '1951', 'MON': '10', 'TOTAL': '27.2', 'ClimAdjust': '26.01', 'ANOM': '1.19'}
{'YR': '1951', 'MON': '11', 'TOTAL': '27.25', 'ClimAdjust': '26.06', 'ANOM': '1.19'}
{'YR': '1951', 'MON': '12', 'TOTAL': '26.92', 'ClimAdjust': '26.18', 'ANOM': '0.74'}
{'YR': '1952', 'MON': '1', 'TOTAL': '26.67', 'ClimAdjust': '26.18', 'ANOM': '0.49'}
{'YR': '1952', 'MON': '2', 'TOTAL': '26.75', 'ClimAdjust': '26.39', 'ANOM': '0.37'}
{'YR': '1952', 'MON': '3', 'TOTAL': '27.19', 'ClimAdjust': '26.95', 'ANOM': '0.24'}
{'YR': '1952', 'MON': '4', 'TOTAL': '27.81', 'ClimAdjust': '27.39', 'ANOM': '0.42'}
{'YR': '1952', 'MON': '5', 'TOTAL': '27.79', 'ClimAdjust': '27.56', 'ANOM': '0.23'}
{'YR': '1952', 'MON': '6', 'TOTAL': '27.18', 'ClimAdjust': '27.21', 'ANOM': '-0.03'}
{'YR': '1952', 'MON': '7', 'TOTAL': '26.52', 'ClimAdjust': '26.72', 'ANOM': '-0.2'}
{'YR': '1952', 'MON': '8', 'TOTAL': '26.3', 'ClimAdjust': '26.3', 'ANOM': '0'}
{'YR': '1952', 'MON': '9', 'TOTAL': '26.35', 'ClimAdjust': '26.14', 'ANOM': '0.21'}
{'YR': '1952', 'MON': '10', 'TOTAL': '26.25', 'ClimAdjust': '26.01', 'ANOM': '0.25'}
{'YR': '1952', 'MON': '11', 'TOTAL': '25.92', 'ClimAdjust': '26.06', 'ANOM': '-0.14'}
{'YR': '1952', 'MON': '12', 'TOTAL': '26.21', 'ClimAdjust': '26.18', 'ANOM': '0.03'}
{'YR': '1953', 'MON': '1', 'TOTAL': '26.74', 'ClimAdjust': '26.18', 'ANOM': '0.56'}
{'YR': '1953', 'MON': '2', 'TOTAL': '27', 'ClimAdjust': '26.39', 'ANOM': '0.61'}
{'YR': '1953', 'MON': '3', 'TOTAL': '27.57', 'ClimAdjust': '26.95', 'ANOM': '0.62'}
{'YR': '1953', 'MON': '4', 'TOTAL': '28.03', 'ClimAdjust': '27.39', 'ANOM': '0.64'}
{'YR': '1953', 'MON': '5', 'TOTAL': '28.28', 'ClimAdjust': '27.56', 'ANOM': '0.71'}
{'YR': '1953', 'MON': '6', 'TOTAL': '28.12', 'ClimAdjust': '27.21', 'ANOM': '0.9'}
{'YR': '1953', 'MON': '7', 'TOTAL': '27.42', 'ClimAdjust': '26.72', 'ANOM': '0.7'}
{'YR': '1953', 'MON': '8', 'TOTAL': '26.93', 'ClimAdjust': '26.3', 'ANOM': '0.63'}
{'YR': '1953', 'MON': '9', 'TOTAL': '27', 'ClimAdjust': '26.14', 'ANOM': '0.85'}
{'YR': '1953', 'MON': '10', 'TOTAL': '26.87', 'ClimAdjust': '26.01', 'ANOM': '0.86'}
{'YR': '1953', 'MON': '11', 'TOTAL': '26.88', 'ClimAdjust': '26.06', 'ANOM': '0.82'}
{'YR': '1953', 'MON': '12', 'TOTAL': '27.01', 'ClimAdjust': '26.18', 'ANOM': '0.83'}
{'YR': '1954', 'MON': '1', 'TOTAL': '26.98', 'ClimAdjust': '26.18', 'ANOM': '0.8'}
{'YR': '1954', 'MON': '2', 'TOTAL': '27.03', 'ClimAdjust': '26.39', 'ANOM': '0.64'}
{'YR': '1954', 'MON': '3', 'TOTAL': '26.91', 'ClimAdjust': '26.95', 'ANOM': '-0.04'}
{'YR': '1954', 'MON': '4', 'TOTAL': '26.65', 'ClimAdjust': '27.39', 'ANOM': '-0.74'}
{'YR': '1954', 'MON': '5', 'TOTAL': '27.11', 'ClimAdjust': '27.56', 'ANOM': '-0.45'}
{'YR': '1954', 'MON': '6', 'TOTAL': '26.79', 'ClimAdjust': '27.21', 'ANOM': '-0.42'}
{'YR': '1954', 'MON': '7', 'TOTAL': '26.1', 'ClimAdjust': '26.72', 'ANOM': '-0.62'}
{'YR': '1954', 'MON': '8', 'TOTAL': '25.42', 'ClimAdjust': '26.3', 'ANOM': '-0.88'}
{'YR': '1954', 'MON': '9', 'TOTAL': '25.11', 'ClimAdjust': '26.14', 'ANOM': '-1.03'}
{'YR': '1954', 'MON': '10', 'TOTAL': '25.22', 'ClimAdjust': '26.01', 'ANOM': '-0.78'}
{'YR': '1954', 'MON': '11', 'TOTAL': '25.56', 'ClimAdjust': '26.06', 'ANOM': '-0.5'}
{'YR': '1954', 'MON': '12', 'TOTAL': '25.26', 'ClimAdjust': '26.18', 'ANOM': '-0.91'}
{'YR': '1955', 'MON': '1', 'TOTAL': '25.62', 'ClimAdjust': '26.18', 'ANOM': '-0.56'}
{'YR': '1955', 'MON': '2', 'TOTAL': '25.82', 'ClimAdjust': '26.39', 'ANOM': '-0.57'}
{'YR': '1955', 'MON': '3', 'TOTAL': '26.23', 'ClimAdjust': '26.95', 'ANOM': '-0.72'}
{'YR': '1955', 'MON': '4', 'TOTAL': '26.61', 'ClimAdjust': '27.39', 'ANOM': '-0.78'}
{'YR': '1955', 'MON': '5', 'TOTAL': '26.65', 'ClimAdjust': '27.56', 'ANOM': '-0.91'}
{'YR': '1955', 'MON': '6', 'TOTAL': '26.54', 'ClimAdjust': '27.21', 'ANOM': '-0.67'}
{'YR': '1955', 'MON': '7', 'TOTAL': '26.14', 'ClimAdjust': '26.72', 'ANOM': '-0.58'}
{'YR': '1955', 'MON': '8', 'TOTAL': '25.5', 'ClimAdjust': '26.3', 'ANOM': '-0.8'}
{'YR': '1955', 'MON': '9', 'TOTAL': '25.28', 'ClimAdjust': '26.14', 'ANOM': '-0.87'}
{'YR': '1955', 'MON': '10', 'TOTAL': '24.41', 'ClimAdjust': '26.01', 'ANOM': '-1.6'}
{'YR': '1955', 'MON': '11', 'TOTAL': '24.25', 'ClimAdjust': '26.06', 'ANOM': '-1.81'}
{'YR': '1955', 'MON': '12', 'TOTAL': '24.57', 'ClimAdjust': '26.18', 'ANOM': '-1.61'}
{'YR': '1956', 'MON': '1', 'TOTAL': '25.34', 'ClimAdjust': '26.33', 'ANOM': '-0.99'}
{'YR': '1956', 'MON': '2', 'TOTAL': '25.77', 'ClimAdjust': '26.51', 'ANOM': '-0.74'}
{'YR': '1956', 'MON': '3', 'TOTAL': '26.47', 'ClimAdjust': '27.01', 'ANOM': '-0.54'}
{'YR': '1956', 'MON': '4', 'TOTAL': '26.86', 'ClimAdjust': '27.46', 'ANOM': '-0.6'}
{'YR': '1956', 'MON': '5', 'TOTAL': '27.13', 'ClimAdjust': '27.59', 'ANOM': '-0.46'}
{'YR': '1956', 'MON': '6', 'TOTAL': '26.81', 'ClimAdjust': '27.29', 'ANOM': '-0.48'}
{'YR': '1956', 'MON': '7', 'TOTAL': '26.22', 'ClimAdjust': '26.8', 'ANOM': '-0.58'}
{'YR': '1956', 'MON': '8', 'TOTAL': '25.67', 'ClimAdjust': '26.32', 'ANOM': '-0.65'}
{'YR': '1956', 'MON': '9', 'TOTAL': '25.72', 'ClimAdjust': '26.15', 'ANOM': '-0.43'}
{'YR': '1956', 'MON': '10', 'TOTAL': '25.74', 'ClimAdjust': '26.03', 'ANOM': '-0.29'}
{'YR': '1956', 'MON': '11', 'TOTAL': '25.56', 'ClimAdjust': '26.1', 'ANOM': '-0.54'}
{'YR': '1956', 'MON': '12', 'TOTAL': '25.71', 'ClimAdjust': '26.18', 'ANOM': '-0.47'}
{'YR': '1957', 'MON': '1', 'TOTAL': '26.04', 'ClimAdjust': '26.33', 'ANOM': '-0.29'}
{'YR': '1957', 'MON': '2', 'TOTAL': '26.54', 'ClimAdjust': '26.51', 'ANOM': '0.02'}
{'YR': '1957', 'MON': '3', 'TOTAL': '27.46', 'ClimAdjust': '27.01', 'ANOM': '0.45'}
{'YR': '1957', 'MON': '4', 'TOTAL': '28.23', 'ClimAdjust': '27.46', 'ANOM': '0.77'}
{'YR': '1957', 'MON': '5', 'TOTAL': '28.54', 'ClimAdjust': '27.59', 'ANOM': '0.94'}
{'YR': '1957', 'MON': '6', 'TOTAL': '28.35', 'ClimAdjust': '27.29', 'ANOM': '1.05'}
{'YR': '1957', 'MON': '7', 'TOTAL': '28.15', 'ClimAdjust': '26.8', 'ANOM': '1.34'}
{'YR': '1957', 'MON': '8', 'TOTAL': '27.68', 'ClimAdjust': '26.32', 'ANOM': '1.36'}
{'YR': '1957', 'MON': '9', 'TOTAL': '27.42', 'ClimAdjust': '26.15', 'ANOM': '1.27'}
{'YR': '1957', 'MON': '10', 'TOTAL': '27.41', 'ClimAdjust': '26.03', 'ANOM': '1.37'}
{'YR': '1957', 'MON': '11', 'TOTAL': '27.62', 'ClimAdjust': '26.1', 'ANOM': '1.52'}
{'YR': '1957', 'MON': '12', 'TOTAL': '27.89', 'ClimAdjust': '26.18', 'ANOM': '1.71'}
{'YR': '1958', 'MON': '1', 'TOTAL': '28.32', 'ClimAdjust': '26.33', 'ANOM': '1.98'}
{'YR': '1958', 'MON': '2', 'TOTAL': '28.24', 'ClimAdjust': '26.51', 'ANOM': '1.72'}
{'YR': '1958', 'MON': '3', 'TOTAL': '28.27', 'ClimAdjust': '27.01', 'ANOM': '1.26'}
{'YR': '1958', 'MON': '4', 'TOTAL': '28.28', 'ClimAdjust': '27.46', 'ANOM': '0.81'}
{'YR': '1958', 'MON': '5', 'TOTAL': '28.3', 'ClimAdjust': '27.59', 'ANOM': '0.71'}
{'YR': '1958', 'MON': '6', 'TOTAL': '27.98', 'ClimAdjust': '27.29', 'ANOM': '0.69'}
{'YR': '1958', 'MON': '7', 'TOTAL': '27.31', 'ClimAdjust': '26.8', 'ANOM': '0.51'}
{'YR': '1958', 'MON': '8', 'TOTAL': '26.84', 'ClimAdjust': '26.32', 'ANOM': '0.52'}
{'YR': '1958', 'MON': '9', 'TOTAL': '26.4', 'ClimAdjust': '26.15', 'ANOM': '0.25'}
{'YR': '1958', 'MON': '10', 'TOTAL': '26.45', 'ClimAdjust': '26.03', 'ANOM': '0.41'}
{'YR': '1958', 'MON': '11', 'TOTAL': '26.75', 'ClimAdjust': '26.1', 'ANOM': '0.65'}
{'YR': '1958', 'MON': '12', 'TOTAL': '26.61', 'ClimAdjust': '26.18', 'ANOM': '0.44'}
{'YR': '1959', 'MON': '1', 'TOTAL': '27.07', 'ClimAdjust': '26.33', 'ANOM': '0.74'}
{'YR': '1959', 'MON': '2', 'TOTAL': '27.18', 'ClimAdjust': '26.51', 'ANOM': '0.67'}
{'YR': '1959', 'MON': '3', 'TOTAL': '27.47', 'ClimAdjust': '27.01', 'ANOM': '0.46'}
{'YR': '1959', 'MON': '4', 'TOTAL': '27.88', 'ClimAdjust': '27.46', 'ANOM': '0.42'}
{'YR': '1959', 'MON': '5', 'TOTAL': '27.69', 'ClimAdjust': '27.59', 'ANOM': '0.1'}
{'YR': '1959', 'MON': '6', 'TOTAL': '27.36', 'ClimAdjust': '27.29', 'ANOM': '0.07'}
{'YR': '1959', 'MON': '7', 'TOTAL': '26.43', 'ClimAdjust': '26.8', 'ANOM': '-0.37'}
{'YR': '1959', 'MON': '8', 'TOTAL': '26.09', 'ClimAdjust': '26.32', 'ANOM': '-0.24'}
{'YR': '1959', 'MON': '9', 'TOTAL': '25.92', 'ClimAdjust': '26.15', 'ANOM': '-0.23'}
{'YR': '1959', 'MON': '10', 'TOTAL': '26.24', 'ClimAdjust': '26.03', 'ANOM': '0.2'}
{'YR': '1959', 'MON': '11', 'TOTAL': '26.04', 'ClimAdjust': '26.1', 'ANOM': '-0.06'}
{'YR': '1959', 'MON': '12', 'TOTAL': '26.18', 'ClimAdjust': '26.18', 'ANOM': '0'}
{'YR': '1960', 'MON': '1', 'TOTAL': '26.26', 'ClimAdjust': '26.33', 'ANOM': '-0.07'}
{'YR': '1960', 'MON': '2', 'TOTAL': '26.29', 'ClimAdjust': '26.51', 'ANOM': '-0.22'}
{'YR': '1960', 'MON': '3', 'TOTAL': '26.99', 'ClimAdjust': '27.01', 'ANOM': '-0.02'}
{'YR': '1960', 'MON': '4', 'TOTAL': '27.49', 'ClimAdjust': '27.46', 'ANOM': '0.03'}
{'YR': '1960', 'MON': '5', 'TOTAL': '27.68', 'ClimAdjust': '27.59', 'ANOM': '0.08'}
{'YR': '1960', 'MON': '6', 'TOTAL': '27.23', 'ClimAdjust': '27.29', 'ANOM': '-0.06'}
{'YR': '1960', 'MON': '7', 'TOTAL': '26.87', 'ClimAdjust': '26.8', 'ANOM': '0.07'}
{'YR': '1960', 'MON': '8', 'TOTAL': '26.69', 'ClimAdjust': '26.32', 'ANOM': '0.36'}
{'YR': '1960', 'MON': '9', 'TOTAL': '26.43', 'ClimAdjust': '26.15', 'ANOM': '0.28'}
{'YR': '1960', 'MON': '10', 'TOTAL': '26.21', 'ClimAdjust': '26.03', 'ANOM': '0.18'}
{'YR': '1960', 'MON': '11', 'TOTAL': '26.25', 'ClimAdjust': '26.1', 'ANOM': '0.15'}
{'YR': '1960', 'MON': '12', 'TOTAL': '26.22', 'ClimAdjust': '26.18', 'ANOM': '0.04'}
{'YR': '1961', 'MON': '1', 'TOTAL': '26.23', 'ClimAdjust': '26.27', 'ANOM': '-0.04'}
{'YR': '1961', 'MON': '2', 'TOTAL': '26.56', 'ClimAdjust': '26.45', 'ANOM': '0.1'}
{'YR': '1961', 'MON': '3', 'TOTAL': '26.94', 'ClimAdjust': '26.92', 'ANOM': '0.02'}
{'YR': '1961', 'MON': '4', 'TOTAL': '27.37', 'ClimAdjust': '27.37', 'ANOM': '0'}
{'YR': '1961', 'MON': '5', 'TOTAL': '27.75', 'ClimAdjust': '27.49', 'ANOM': '0.26'}
{'YR': '1961', 'MON': '6', 'TOTAL': '27.66', 'ClimAdjust': '27.22', 'ANOM': '0.44'}
{'YR': '1961', 'MON': '7', 'TOTAL': '26.87', 'ClimAdjust': '26.76', 'ANOM': '0.11'}
{'YR': '1961', 'MON': '8', 'TOTAL': '26.18', 'ClimAdjust': '26.3', 'ANOM': '-0.12'}
{'YR': '1961', 'MON': '9', 'TOTAL': '25.78', 'ClimAdjust': '26.16', 'ANOM': '-0.38'}
{'YR': '1961', 'MON': '10', 'TOTAL': '25.7', 'ClimAdjust': '26.09', 'ANOM': '-0.38'}
{'YR': '1961', 'MON': '11', 'TOTAL': '26.07', 'ClimAdjust': '26.08', 'ANOM': '-0.01'}
{'YR': '1961', 'MON': '12', 'TOTAL': '25.98', 'ClimAdjust': '26.14', 'ANOM': '-0.16'}
{'YR': '1962', 'MON': '1', 'TOTAL': '25.96', 'ClimAdjust': '26.27', 'ANOM': '-0.3'}
{'YR': '1962', 'MON': '2', 'TOTAL': '26.2', 'ClimAdjust': '26.45', 'ANOM': '-0.26'}
{'YR': '1962', 'MON': '3', 'TOTAL': '26.81', 'ClimAdjust': '26.92', 'ANOM': '-0.11'}
{'YR': '1962', 'MON': '4', 'TOTAL': '27.13', 'ClimAdjust': '27.37', 'ANOM': '-0.24'}
{'YR': '1962', 'MON': '5', 'TOTAL': '27.05', 'ClimAdjust': '27.49', 'ANOM': '-0.44'}
{'YR': '1962', 'MON': '6', 'TOTAL': '27.08', 'ClimAdjust': '27.22', 'ANOM': '-0.14'}
{'YR': '1962', 'MON': '7', 'TOTAL': '26.75', 'ClimAdjust': '26.76', 'ANOM': '0'}
{'YR': '1962', 'MON': '8', 'TOTAL': '26.32', 'ClimAdjust': '26.3', 'ANOM': '0.02'}
{'YR': '1962', 'MON': '9', 'TOTAL': '25.93', 'ClimAdjust': '26.16', 'ANOM': '-0.23'}
{'YR': '1962', 'MON': '10', 'TOTAL': '25.96', 'ClimAdjust': '26.09', 'ANOM': '-0.12'}
{'YR': '1962', 'MON': '11', 'TOTAL': '25.75', 'ClimAdjust': '26.08', 'ANOM': '-0.32'}
{'YR': '1962', 'MON': '12', 'TOTAL': '25.67', 'ClimAdjust': '26.14', 'ANOM': '-0.47'}
{'YR': '1963', 'MON': '1', 'TOTAL': '25.77', 'ClimAdjust': '26.27', 'ANOM': '-0.5'}
{'YR': '1963', 'MON': '2', 'TOTAL': '26.23', 'ClimAdjust': '26.45', 'ANOM': '-0.23'}
{'YR': '1963', 'MON': '3', 'TOTAL': '27.18', 'ClimAdjust': '26.92', 'ANOM': '0.26'}
{'YR': '1963', 'MON': '4', 'TOTAL': '27.79', 'ClimAdjust': '27.37', 'ANOM': '0.41'}
{'YR': '1963', 'MON': '5', 'TOTAL': '27.63', 'ClimAdjust': '27.49', 'ANOM': '0.14'}
{'YR': '1963', 'MON': '6', 'TOTAL': '27.61', 'ClimAdjust': '27.22', 'ANOM': '0.39'}
{'YR': '1963', 'MON': '7', 'TOTAL': '27.77', 'ClimAdjust': '26.76', 'ANOM': '1.02'}
{'YR': '1963', 'MON': '8', 'TOTAL': '27.47', 'ClimAdjust': '26.3', 'ANOM': '1.17'}
{'YR': '1963', 'MON': '9', 'TOTAL': '27.39', 'ClimAdjust': '26.16', 'ANOM': '1.23'}
{'YR': '1963', 'MON': '10', 'TOTAL': '27.35', 'ClimAdjust': '26.09', 'ANOM': '1.26'}
{'YR': '1963', 'MON': '11', 'TOTAL': '27.46', 'ClimAdjust': '26.08', 'ANOM': '1.39'}
{'YR': '1963', 'MON': '12', 'TOTAL': '27.61', 'ClimAdjust': '26.14', 'ANOM': '1.47'}
{'YR': '1964', 'MON': '1', 'TOTAL': '27.33', 'ClimAdjust': '26.27', 'ANOM': '1.06'}
---------------------------------------------------------------------------
KeyboardInterrupt                         Traceback (most recent call last)
Input In [24], in <cell line: 1>()
      2 nino = csv.DictReader(ifh, delimiter=" ")
      3 for row in nino:
----> 4     print(row)

File /mnt/zfs/jupyter-p03/home/gkrichar/.ipython/profile_default/startup/cs114-setup.py:5, in print(*args, **kwargs)
----> 5 def print(*args, **kwargs): builtins.print(*args, **kwargs); sys.stdout.flush(); time.sleep(0.04)

KeyboardInterrupt: 
In [25]:
def words(line: str) -> list[str]:
    letters = ""
    for ch in line.lower():
        if ch >= "a" and ch <= "z":
            letters = letters + ch
        else:
            letters = letters + " "
    return letters.strip().split()

print(words("These are just some of my favorite words!"))
['these', 'are', 'just', 'some', 'of', 'my', 'favorite', 'words']
In [26]:
import typing

def distribution(lst: typing.Sequence) -> dict[typing.Any, int]:
    r = {}
    for val in lst:
        if not (val in r):
            r[val] = 0
        r[val] = r[val] + 1
    return r
In [27]:
def wordDistributionCSV(outFilename: str, inFilename: str) -> None:
    # 1: Words
    inWords: list[str] = []
    with open(inFilename) as ifh:
        for line in ifh:
            inWords = inWords + words(line)
            
    # 2: Distribution and sorting
    dist = distribution(inWords)
    def dictValue(key: str) -> int:
        return dist[key]
    byFreq = sorted(dist, reverse=True, key=dictValue)
    
    # 3: Write CSV
    with open(outFilename, "w") as ofh:
        outCSV = csv.DictWriter(ofh, ["Word", "# of appearances"])
        outCSV.writeheader()
        for word in byFreq:
            outCSV.writerow({
                "Word": word,
                "# of appearances": dist[word]
            })

wordDistributionCSV("cities-words.csv", "a-tale-of-two-cities.txt")