diff --git a/exercises/source/exercise-05/1__for_loops_functions_and_dicts.ipynb b/exercises/source/exercise-05/1__for_loops_functions_and_dicts.ipynb
new file mode 100644
index 0000000..b1cd87f
--- /dev/null
+++ b/exercises/source/exercise-05/1__for_loops_functions_and_dicts.ipynb
@@ -0,0 +1,1130 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {
+ "nbgrader": {
+ "grade": false,
+ "grade_id": "cell-494826e8c27cdbcb",
+ "locked": true,
+ "schema_version": 3,
+ "solution": false,
+ "task": false
+ }
+ },
+ "outputs": [],
+ "source": [
+ "# You must run this cell, but you can ignore its contents.\n",
+ "import hashlib\n",
+ "\n",
+ "def ads_hash(ty):\n",
+ " \"\"\"Return a unique string for input\"\"\"\n",
+ " ty_str = str(ty).encode()\n",
+ " m = hashlib.sha256()\n",
+ " m.update(ty_str)\n",
+ " return m.hexdigest()[:10]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {
+ "nbgrader": {
+ "grade": false,
+ "grade_id": "cell-592b21fffec74d63",
+ "locked": true,
+ "schema_version": 3,
+ "solution": false,
+ "task": false
+ }
+ },
+ "outputs": [],
+ "source": [
+ "# You must also run this cell.\n",
+ "import matplotlib.pyplot as plt"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "nbgrader": {
+ "grade": false,
+ "grade_id": "cell-4e22e2660edab610",
+ "locked": true,
+ "schema_version": 3,
+ "solution": false,
+ "task": false
+ },
+ "tags": []
+ },
+ "source": [
+ "# Flow control - `for` loops with `range(n)`\n",
+ "\n",
+ "Remember from the previous exercise you defined a function like this:\n",
+ "\n",
+ "```python\n",
+ "def simulate_generation(a,Rt):\n",
+ " previous = a[-1]\n",
+ " new_infected = previous*Rt\n",
+ " a.append(new_infected)\n",
+ "```\n",
+ "\n",
+ "This implements a single new generation using the basic formula for reproduction:\n",
+ "\n",
+ "$N_{t+1} = R_t N_t$\n",
+ "\n",
+ "Now, consider this code:\n",
+ "\n",
+ "```python\n",
+ "x = [1]\n",
+ "for i in range(5):\n",
+ " simulate_generation(x, 2)\n",
+ "```\n",
+ "\n",
+ "When run, `x` will have a value of `[1, 2, 4, 8, 16, 32]`.\n",
+ "\n",
+ "## Q1\n",
+ "\n",
+ "Write a function called `simulate_n_generations` which takes two arguments, `n` and `Rt`. The first argument `n` will be the number of generations to simulate. The second argument, `Rt` is as above. Your function should return the number of infected individuals, starting from a single individual, after `n` generations.\n",
+ "\n",
+ "The function signature should look like this:\n",
+ "\n",
+ "```python\n",
+ "def simulate_n_generations(n,Rt):\n",
+ "```\n",
+ "\n",
+ "If you run your new function like this:\n",
+ "\n",
+ "```python\n",
+ "simulate_n_generations(10, 2)\n",
+ "```\n",
+ "\n",
+ "the result should be `[1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024]`.\n",
+ "\n",
+ "Hint: copy the `simulate_generation` function definiton from above and use it."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {
+ "nbgrader": {
+ "grade": false,
+ "grade_id": "cell-d2a294ee5e6f9e3b",
+ "locked": false,
+ "schema_version": 3,
+ "solution": true,
+ "task": false
+ }
+ },
+ "outputs": [],
+ "source": [
+ "def simulate_generation(a,Rt):\n",
+ " previous = a[-1]\n",
+ " new_infected = previous*Rt\n",
+ " a.append(new_infected)\n",
+ " \n",
+ "def simulate_n_generations(n,Rt):\n",
+ " a = [1]\n",
+ " for i in range(n):\n",
+ " simulate_generation(a,Rt)\n",
+ " return a"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {
+ "nbgrader": {
+ "grade": true,
+ "grade_id": "cell-34471e259a21b377",
+ "locked": true,
+ "points": 1,
+ "schema_version": 3,
+ "solution": false,
+ "task": false
+ }
+ },
+ "outputs": [],
+ "source": [
+ "# If this runs without error, it means the answer in your previous cell was correct.\n",
+ "\n",
+ "assert ads_hash(simulate_n_generations(10, 2)) == 'a9ad958975'\n",
+ "assert ads_hash(simulate_n_generations(9, 3)) == '1f0b039679'"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "nbgrader": {
+ "grade": false,
+ "grade_id": "cell-7d95e6913ad535d7",
+ "locked": true,
+ "schema_version": 3,
+ "solution": false,
+ "task": false
+ }
+ },
+ "source": [
+ "## Q2\n",
+ "\n",
+ "Recall that \n",
+ "\n",
+ "- `range(n)` returns an *iterator* starting at `0` and ending at `n`.\n",
+ "- `range(start, end)` returns an iterator starting at `start` and ending before `end`.\n",
+ "- `range(start, end, inc)` returns an iterator starting at `start` and ending before `end` with an increment of `inc`.\n",
+ "\n",
+ "Thus, this code\n",
+ "\n",
+ "```python\n",
+ "x = []\n",
+ "for i in range(10, 1000, 203):\n",
+ " x.append(i)\n",
+ "```\n",
+ "\n",
+ "Will set `x` equal to `[10, 213, 416, 619, 822]`\n",
+ "\n",
+ "Create a list named `my_list` which starts at 10, ends before 1000 and has an increment of 21."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {
+ "nbgrader": {
+ "grade": false,
+ "grade_id": "cell-97f27abad4bca5a7",
+ "locked": false,
+ "schema_version": 3,
+ "solution": true,
+ "task": false
+ }
+ },
+ "outputs": [],
+ "source": [
+ "my_list = []\n",
+ "for i in range(10, 1000, 21):\n",
+ " my_list.append(i)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {
+ "nbgrader": {
+ "grade": true,
+ "grade_id": "cell-ba9f9e26ac285bb5",
+ "locked": true,
+ "points": 1,
+ "schema_version": 3,
+ "solution": false,
+ "task": false
+ }
+ },
+ "outputs": [],
+ "source": [
+ "# If this runs without error, it means the answer in your previous cell was correct.\n",
+ "\n",
+ "assert ads_hash(my_list)=='c25a617fa9'"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "nbgrader": {
+ "grade": false,
+ "grade_id": "cell-90de2683a98d0ac5",
+ "locked": true,
+ "schema_version": 3,
+ "solution": false,
+ "task": false
+ },
+ "tags": []
+ },
+ "source": [
+ "# Flow control - for loops that iterate through a list\n",
+ "\n",
+ "Remember that `for` loops will *iterate* through any *iterator*, and lists are iterators.\n",
+ "\n",
+ "Therefore this\n",
+ "\n",
+ "```python\n",
+ "cumulative = 0\n",
+ "for x in [1,2,3,100]:\n",
+ " cumulative = cumulative + x\n",
+ "```\n",
+ "\n",
+ "sets `cumulative` to 106.\n",
+ "\n",
+ "## Q1\n",
+ "\n",
+ "Create a function `cum_sum` which takes a single argument `x`. `x` will be an iterator and your function should return the sum of all values in the iterator.\n",
+ "\n",
+ "The function signature is:\n",
+ "\n",
+ "```python\n",
+ "def cum_sum(x):\n",
+ "```"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {
+ "jupyter": {
+ "source_hidden": true
+ },
+ "nbgrader": {
+ "grade": false,
+ "grade_id": "cell-5c41a83f5efb3f97",
+ "locked": false,
+ "schema_version": 3,
+ "solution": true,
+ "task": false
+ },
+ "tags": []
+ },
+ "outputs": [],
+ "source": [
+ "def cum_sum(x):\n",
+ " cum = 0\n",
+ " for i in x:\n",
+ " cum = cum + i\n",
+ " return cum"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {
+ "nbgrader": {
+ "grade": true,
+ "grade_id": "cell-01d1590cc0a3c37f",
+ "locked": true,
+ "points": 1,
+ "schema_version": 3,
+ "solution": false,
+ "task": false
+ }
+ },
+ "outputs": [],
+ "source": [
+ "# If this runs without error, it means the answer in your previous cell was correct.\n",
+ "\n",
+ "assert ads_hash(cum_sum([1,3,3,451,34,2,3]))=='dcb5d6e69e'\n",
+ "assert ads_hash(cum_sum([1,3,3,-12,32,1,3]))=='eb1e33e8a8'"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "nbgrader": {
+ "grade": false,
+ "grade_id": "cell-c6115c6a8fc2824f",
+ "locked": true,
+ "schema_version": 3,
+ "solution": false,
+ "task": false
+ }
+ },
+ "source": [
+ "## Practice with functions"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "nbgrader": {
+ "grade": false,
+ "grade_id": "cell-6e6f3ca73e99b3e7",
+ "locked": true,
+ "schema_version": 3,
+ "solution": false,
+ "task": false
+ }
+ },
+ "source": [
+ "### Q1 Make a function `compute_seq2(n)` which computes the a sequence of length `n` according to the following pattern:\n",
+ "\n",
+ "`2, 2, 4, 6, 10, 16, 26 ...`\n",
+ "\n",
+ "Hint: this is a Fibonacci sequence with initial elements 2."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {
+ "nbgrader": {
+ "grade": false,
+ "grade_id": "cell-8d48778fdbfb317e",
+ "locked": false,
+ "schema_version": 3,
+ "solution": true,
+ "task": false
+ }
+ },
+ "outputs": [],
+ "source": [
+ "def compute_seq2(n):\n",
+ " if n == 1:\n",
+ " return [2]\n",
+ " elif n == 2:\n",
+ " return [2,2]\n",
+ " else:\n",
+ " result = compute_seq2(n-1)\n",
+ " a = result[-2]\n",
+ " b = result[-1]\n",
+ " result.append(a+b)\n",
+ " return result"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {
+ "nbgrader": {
+ "grade": true,
+ "grade_id": "cell-e7e80f9bdb4eeb08",
+ "locked": true,
+ "points": 1,
+ "schema_version": 3,
+ "solution": false,
+ "task": false
+ }
+ },
+ "outputs": [],
+ "source": [
+ "# If this runs without error, it means `compute_seq2()` behaves correctly.\n",
+ "assert compute_seq2(16)==[2, 2, 4, 6, 10, 16, 26, 42, 68, 110, 178, 288, 466, 754, 1220, 1974]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "nbgrader": {
+ "grade": false,
+ "grade_id": "cell-2ce1883510b6a1b4",
+ "locked": true,
+ "schema_version": 3,
+ "solution": false,
+ "task": false
+ }
+ },
+ "source": [
+ "### Q2 Make a function `compute_seq3(n)` which computes the a sequence of length `n` according to the following pattern:\n",
+ "\n",
+ "`1, 1, 1, 2, 3, 4, 6, 9, 13, 19, 28, ...`\n",
+ "\n",
+ "Hint: this is very similar to the Fibonacci sequence, but each element at index `n` is the sum of the elements at index `n-1` and `n-3`. The first three elements are `1`."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {
+ "nbgrader": {
+ "grade": false,
+ "grade_id": "cell-5aeb59f4e391239b",
+ "locked": false,
+ "schema_version": 3,
+ "solution": true,
+ "task": false
+ }
+ },
+ "outputs": [],
+ "source": [
+ "def compute_seq3(n):\n",
+ " assert type(n)==int\n",
+ " assert n > 0\n",
+ " if n == 1:\n",
+ " return [1]\n",
+ " elif n == 2:\n",
+ " return [1,1]\n",
+ " elif n == 3:\n",
+ " return [1,1,1]\n",
+ " else:\n",
+ " result = compute_seq3(n-1)\n",
+ " a = result[-3]\n",
+ " b = result[-1]\n",
+ " result.append(a+b)\n",
+ " return result"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {
+ "nbgrader": {
+ "grade": true,
+ "grade_id": "cell-0c52f8d0b74caa5e",
+ "locked": true,
+ "points": 1,
+ "schema_version": 3,
+ "solution": false,
+ "task": false
+ }
+ },
+ "outputs": [],
+ "source": [
+ "# If this runs without error, it means `compute_seq1()` behaves correctly.\n",
+ "assert compute_seq3(16)==[1, 1, 1, 2, 3, 4, 6, 9, 13, 19, 28, 41, 60, 88, 129, 189]\n",
+ "assert ads_hash(compute_seq3(30)) == '210bfe49ef'"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "nbgrader": {
+ "grade": false,
+ "grade_id": "cell-03d11f5c31865fa6",
+ "locked": true,
+ "schema_version": 3,
+ "solution": false,
+ "task": false
+ }
+ },
+ "source": [
+ "## Practice converting types and using loops\n",
+ "\n",
+ "You are a biologist at Cape Verde to study one of the most important nesting sites for loggerhead sea turtles. You are studying the numbers and sexes of young turtles as they hatch. During the data collection part of your project, you have taken notes by typing \"m\" for male and \"f\" for female."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {
+ "nbgrader": {
+ "grade": false,
+ "grade_id": "cell-06a01be28c18339a",
+ "locked": true,
+ "schema_version": 3,
+ "solution": false,
+ "task": false
+ }
+ },
+ "outputs": [],
+ "source": [
+ "# Here are your data.\n",
+ "\n",
+ "nest1 = \"fffffmmmfmmfffmfmmmfffffffmmffmmfffmmmmffmmffmmmfmmmffmmmmffffmmmfffmffmfmfmfmmffmfmmffmfmmf\"\n",
+ "nest2 = \"mmmfmffffmmmfmmfmfmmffmffmfmfmffmffmmmfmfffmfmfffmffmmfmfmfmmffmfmmf\"\n",
+ "nest3 = \"ffffffmmmfmmfffmfmmmffmfmmmfffmmfffmffffmffmmmffffffmmmfmmfffmfmmmffmfmm\"\n",
+ "nest4 = \"fmfmfmmffmffmfmffffffmfmfmffmffmfmfmmfffffmfmfmmffmffmfmmmfmmmmmmfmfmmm\""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "nbgrader": {
+ "grade": false,
+ "grade_id": "cell-c998e2a3545270ce",
+ "locked": true,
+ "schema_version": 3,
+ "solution": false,
+ "task": false
+ }
+ },
+ "source": [
+ "A string (`str` in Python) is a *sequence* which can be *iterated*, as in a for loop. You also know the `range` and `list` types, which can also be iterated. When you iterate over an `str`, each item is a signle character `str`:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "metadata": {
+ "nbgrader": {
+ "grade": false,
+ "grade_id": "cell-7f96e853d095f8fc",
+ "locked": true,
+ "schema_version": 3,
+ "solution": false,
+ "task": false
+ }
+ },
+ "outputs": [],
+ "source": [
+ "count = 0\n",
+ "for char in nest1:\n",
+ " assert type(char)==str\n",
+ " count = count + 1"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "metadata": {
+ "nbgrader": {
+ "grade": false,
+ "grade_id": "cell-23e2ec7eac2011ae",
+ "locked": true,
+ "schema_version": 3,
+ "solution": false,
+ "task": false
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "92"
+ ]
+ },
+ "execution_count": 15,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "count"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "nbgrader": {
+ "grade": false,
+ "grade_id": "cell-e874a549c51ed6e9",
+ "locked": true,
+ "schema_version": 3,
+ "solution": false,
+ "task": false
+ }
+ },
+ "source": [
+ "## Q3 How many male turtles are in nest1? Count the number of `\"m\"` characters are in the `nest` string. Put the answer in a variable `num_males`."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "metadata": {
+ "nbgrader": {
+ "grade": false,
+ "grade_id": "cell-efbc7c6cbe040063",
+ "locked": false,
+ "schema_version": 3,
+ "solution": true,
+ "task": false
+ }
+ },
+ "outputs": [],
+ "source": [
+ "num_males = 0\n",
+ "for char in nest1:\n",
+ " assert type(char)==str\n",
+ " if char=='m':\n",
+ " num_males = num_males + 1\n",
+ " else:\n",
+ " assert char=='f'"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "metadata": {
+ "nbgrader": {
+ "grade": false,
+ "grade_id": "cell-62ab53f78c7a1aa4",
+ "locked": true,
+ "schema_version": 3,
+ "solution": false,
+ "task": false
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "44"
+ ]
+ },
+ "execution_count": 17,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "num_males"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "metadata": {
+ "nbgrader": {
+ "grade": true,
+ "grade_id": "cell-f6cf427c0e834b6d",
+ "locked": true,
+ "points": 1,
+ "schema_version": 3,
+ "solution": false,
+ "task": false
+ }
+ },
+ "outputs": [],
+ "source": [
+ "# If this runs without error, it means the answer in your previous cell was correct.\n",
+ "assert ads_hash(num_males)=='71ee45a3c0'"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Q4 What fraction of all turtles from nest1 are male? Put the answer in a variable `sex_ratio`."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "metadata": {
+ "nbgrader": {
+ "grade": false,
+ "grade_id": "cell-545e9eaa06507765",
+ "locked": false,
+ "schema_version": 3,
+ "solution": true,
+ "task": false
+ }
+ },
+ "outputs": [],
+ "source": [
+ "sex_ratio=num_males / len(nest1)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "metadata": {
+ "nbgrader": {
+ "grade": true,
+ "grade_id": "cell-aec1f9ca60c05951",
+ "locked": true,
+ "points": 1,
+ "schema_version": 3,
+ "solution": false,
+ "task": false
+ }
+ },
+ "outputs": [],
+ "source": [
+ "# If this runs without error, it means the answer in your previous cell was correct.\n",
+ "assert ads_hash(round(sex_ratio*1000))=='200dd69b70'"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "nbgrader": {
+ "grade": false,
+ "grade_id": "cell-9a788ebd56edca64",
+ "locked": true,
+ "schema_version": 3,
+ "solution": false,
+ "task": false
+ }
+ },
+ "source": [
+ "## Q5 Create an empty dict called `empty_observations` with keys 'nest1', 'nest2', 'nest3', 'nest4'. Each value should be an empty list."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 21,
+ "metadata": {
+ "nbgrader": {
+ "grade": false,
+ "grade_id": "cell-cc33b612e98cae30",
+ "locked": false,
+ "schema_version": 3,
+ "solution": true,
+ "task": false
+ }
+ },
+ "outputs": [],
+ "source": [
+ "empty_observations = {'nest1':[],'nest2':[],'nest3':[],'nest4':[]}"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "metadata": {
+ "nbgrader": {
+ "grade": true,
+ "grade_id": "cell-b24ea76aaa1c504a",
+ "locked": true,
+ "points": 1,
+ "schema_version": 3,
+ "solution": false,
+ "task": false
+ }
+ },
+ "outputs": [],
+ "source": [
+ "# If this runs without error, it means the answer in your previous cell was correct.\n",
+ "assert ads_hash(tuple([item for item in empty_observations.items()]))=='5c604a4cc5'"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "nbgrader": {
+ "grade": false,
+ "grade_id": "cell-73e0ee5363629b1a",
+ "locked": true,
+ "schema_version": 3,
+ "solution": false,
+ "task": false
+ }
+ },
+ "source": [
+ "## Q6 Create a dict called `observations` with keys 'nest1', 'nest2', 'nest3', 'nest4'. The values for each key should be as given above in the section just after \"Here are your data.\"\n",
+ "\n",
+ "The key 'nest1' should have value given above for the `nest1` variable (i.e. `\"fffffmmmfmmfffmfmmmfffffffmmffmmfffmmmmffmmffmmmfmmmffmmmmffffmmmfffmffmfmfmfmmffmfmmffmfmmf\"`)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 23,
+ "metadata": {
+ "nbgrader": {
+ "grade": false,
+ "grade_id": "cell-40c757b8f13d8839",
+ "locked": false,
+ "schema_version": 3,
+ "solution": true,
+ "task": false
+ }
+ },
+ "outputs": [],
+ "source": [
+ "observations = {'nest1': \"fffffmmmfmmfffmfmmmfffffffmmffmmfffmmmmffmmffmmmfmmmffmmmmffffmmmfffmffmfmfmfmmffmfmmffmfmmf\",\n",
+ "'nest2': \"mmmfmffffmmmfmmfmfmmffmffmfmfmffmffmmmfmfffmfmfffmffmmfmfmfmmffmfmmf\",\n",
+ "'nest3': \"ffffffmmmfmmfffmfmmmffmfmmmfffmmfffmffffmffmmmffffffmmmfmmfffmfmmmffmfmm\",\n",
+ "'nest4': \"fmfmfmmffmffmfmffffffmfmfmffmffmfmfmmfffffmfmfmmffmffmfmmmfmmmmmmfmfmmm\",}"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 24,
+ "metadata": {
+ "nbgrader": {
+ "grade": true,
+ "grade_id": "cell-41699e4baeb4f512",
+ "locked": true,
+ "points": 1,
+ "schema_version": 3,
+ "solution": false,
+ "task": false
+ }
+ },
+ "outputs": [],
+ "source": [
+ "# If this runs without error, it means the answer in your previous cell was correct.\n",
+ "assert ads_hash(tuple([item for item in observations.items()]))=='19ea06edbc'"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "nbgrader": {
+ "grade": false,
+ "grade_id": "cell-d2bdc242834633ea",
+ "locked": true,
+ "schema_version": 3,
+ "solution": false,
+ "task": false
+ }
+ },
+ "source": [
+ "## Iterating through a `dict`\n",
+ "\n",
+ "Consider the following:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
+ "metadata": {
+ "nbgrader": {
+ "grade": false,
+ "grade_id": "cell-57062ecaa6dd4e24",
+ "locked": true,
+ "schema_version": 3,
+ "solution": false,
+ "task": false
+ }
+ },
+ "outputs": [],
+ "source": [
+ "data = {'a': 1, 'b': 2, 'c': 3}"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "metadata": {
+ "nbgrader": {
+ "grade": false,
+ "grade_id": "cell-1a4e6fb36a964a4c",
+ "locked": true,
+ "schema_version": 3,
+ "solution": false,
+ "task": false
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "key: a, value: 1\n",
+ "key: b, value: 2\n",
+ "key: c, value: 3\n"
+ ]
+ }
+ ],
+ "source": [
+ "for key in data:\n",
+ " value = data[key]\n",
+ " print(f\"key: {key}, value: {value}\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "nbgrader": {
+ "grade": false,
+ "grade_id": "cell-7a45e8eeafa0152b",
+ "locked": true,
+ "schema_version": 3,
+ "solution": false,
+ "task": false
+ }
+ },
+ "source": [
+ "We see in the above that we can iterate through this dictionary. Let's create a new dictionary based on the first one:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 27,
+ "metadata": {
+ "nbgrader": {
+ "grade": false,
+ "grade_id": "cell-154ab8a613fe8638",
+ "locked": true,
+ "schema_version": 3,
+ "solution": false,
+ "task": false
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "{'a': 1, 'b': 4, 'c': 9}\n"
+ ]
+ }
+ ],
+ "source": [
+ "squared_data = {}\n",
+ "for key in data:\n",
+ " value = data[key]\n",
+ " squared_data[key] = value*value\n",
+ "print(squared_data)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "nbgrader": {
+ "grade": false,
+ "grade_id": "cell-55d5e2b1c6ca9071",
+ "locked": true,
+ "schema_version": 3,
+ "solution": false,
+ "task": false
+ }
+ },
+ "source": [
+ "## Q7. Putting things together: create a dict called `sex_ratios`.\n",
+ "\n",
+ "There should be key for every key from the `observations` dictionary and the value for each key should be the sex ratio for each value in the `observations` dictionary."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 28,
+ "metadata": {
+ "nbgrader": {
+ "grade": false,
+ "grade_id": "cell-d890f019a87700d7",
+ "locked": false,
+ "schema_version": 3,
+ "solution": true,
+ "task": false
+ }
+ },
+ "outputs": [],
+ "source": [
+ "def calc_sex_ratio(x):\n",
+ " num_males = 0\n",
+ " for c in x:\n",
+ " if c == 'm':\n",
+ " num_males = num_males + 1\n",
+ " else:\n",
+ " assert c=='f'\n",
+ " return num_males/len(x)\n",
+ "\n",
+ "sex_ratios = {}\n",
+ "for nest in observations:\n",
+ " sex_ratios[nest] = calc_sex_ratio(observations[nest])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 29,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{'nest1': 0.4782608695652174,\n",
+ " 'nest2': 0.4852941176470588,\n",
+ " 'nest3': 0.4444444444444444,\n",
+ " 'nest4': 0.4788732394366197}"
+ ]
+ },
+ "execution_count": 29,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "sex_ratios"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 30,
+ "metadata": {
+ "nbgrader": {
+ "grade": true,
+ "grade_id": "cell-a583495a57a86cfe",
+ "locked": true,
+ "points": 1,
+ "schema_version": 3,
+ "solution": false,
+ "task": false
+ }
+ },
+ "outputs": [],
+ "source": [
+ "# If this runs without error, it means the answer in your previous cell was correct.\n",
+ "assert ads_hash(tuple([(k,round(v*10000)) for (k,v) in sex_ratios.items()]))=='9d19a5431a'"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "nbgrader": {
+ "grade": false,
+ "grade_id": "cell-839a79cbcdf3f3cf",
+ "locked": true,
+ "schema_version": 3,
+ "solution": false,
+ "task": false
+ }
+ },
+ "source": [
+ "## Q8. Plotting data\n",
+ "\n",
+ "Given the following data, make a plot that looks like the following:\n",
+ "\n",
+ "\n",
+ "\n",
+ "```\n",
+ "year= [1950, 1955, 1960, 1965, 1970, 1975, 1980, 1985, 1990, 1995, 2000, 2005, 2010, 2015]\n",
+ "sex_ratio = [0.51, 0.502, 0.49, 0.495, 0.503, 0.498, 0.51, 0.502, 0.49, 0.495, 0.503, 0.498, 0.73, 0.80]\n",
+ "```"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 31,
+ "metadata": {
+ "nbgrader": {
+ "grade": true,
+ "grade_id": "cell-369c41d4c436ea90",
+ "locked": false,
+ "points": 1,
+ "schema_version": 3,
+ "solution": true,
+ "task": false
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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",
+ "text/plain": [
+ "