#set document(title: "10.5 Nested dictionaries and dictionary comprehension", author: "OpenStax / XYZ Homework") #set page(width: 8.5in, height: auto, margin: 1in) #import "@preview/cetz:0.5.2" #set text(font: ("STIX Two Text", "Libertinus Serif", "New Computer Modern"), size: 10.5pt, lang: "en") #show math.equation: set text(font: ("STIX Two Math", "New Computer Modern Math")) #set par(justify: true, leading: 0.62em, spacing: 0.9em) #set enum(spacing: 1.1em) // room between list items so tall inline fractions don't collide #set list(spacing: 1.1em) #set table(stroke: 0.5pt + rgb("#c7ccd3")) #let BLUE = rgb("#183B6F") // brand navy — section bars + example/solution labels (white on navy 11.09:1) #let ORANGE = rgb("#A94509") // brand primary-700 — AA-safe deep orange for TEXT (5.93:1 on white; raw brand #F37021 is 2.94:1 and must never carry text) #let RED = rgb("#DC2626") // brand error-600 #let GREEN = rgb("#059669") // brand success-600 (decoration only; small green text uses green-text #007942) #show heading.where(level: 1): it => block(width: 100%, above: 0pt, below: 16pt, fill: gradient.linear(BLUE, rgb("#2C5AA0")), inset: (x: 14pt, y: 12pt), radius: 3pt, text(fill: white, weight: "bold", size: 19pt, it.body)) #show heading.where(level: 2): it => block(width: 100%, above: 18pt, below: 10pt, fill: BLUE, inset: (x: 10pt, y: 6pt), radius: 2pt, text(fill: white, weight: "bold", size: 12pt, it.body)) #show heading.where(level: 3): it => text(fill: ORANGE, weight: "bold", size: 12.5pt, it.body) #show heading.where(level: 4): it => text(fill: BLUE, weight: "bold", size: 10.5pt, it.body) #let examplebox(label, title, body) = block(width: 100%, breakable: true, fill: rgb("#EFF1F5"), stroke: 0.5pt + rgb("#CFDDF0"), radius: 4pt, inset: 10pt, above: 12pt, below: 12pt)[ #block(below: 6pt)[#box(fill: BLUE, inset: (x: 6pt, y: 2pt), radius: 2pt, text(fill: white, weight: "bold", size: 8.5pt, label)) #h(0.4em) #strong[#title]] #body] // rail = decorative left rule (raw brand token); labelcolor = AA-safe label text shade #let notebox(label, rail, labelcolor, tint, body) = block(width: 100%, breakable: true, fill: tint, stroke: (left: 3pt + rail), inset: (left: 10pt, rest: 8pt), radius: (right: 4pt), above: 11pt, below: 11pt)[ #text(fill: labelcolor, weight: "bold", size: 7.5pt, tracking: 0.5pt)[#upper(label)] #linebreak() #body] #let solutionbox(body) = block(above: 4pt, below: 8pt)[ #text(fill: BLUE, weight: "bold", size: 8.5pt)[Solution] #linebreak() #body] #let figph(msg) = block(width: 100%, height: 60pt, fill: rgb("#f6f7f9"), stroke: (paint: rgb("#c7ccd3"), dash: "dashed"), radius: 4pt, inset: 10pt)[ #align(center + horizon, text(fill: rgb("#889"), style: "italic", size: 9pt, msg))] // Standardize inlined figure sizes: measure the natural CeTZ canvas, then scale to a // consistent envelope (aspect-aware; see build_typst.py FIG_* constants). Unlike the // print preamble, dimensions are FLOORED: in an editor a user can trim a figure to a // degenerate 1-D shape (a bare line), and w/h or tw/w would then divide by zero. #let _STD_W = 3.5 #let _WIDE_W = 5.6 #let _MAX_H = 3.4 #let _ASPECT_WIDE = 2.2 #let _UPSCALE_MAX = 1.15 #let stdfig(body) = context { let m = measure(body) let w = calc.max(m.width / 1in, 0.01) let h = calc.max(m.height / 1in, 0.01) let tw = if w / h > _ASPECT_WIDE { _WIDE_W } else { _STD_W } let s = calc.min(tw / w, _MAX_H / h, _UPSCALE_MAX) align(center, box(scale(x: s * 100%, y: s * 100%, reflow: true, body))) } #show figure: set block(breakable: false) #set figure(gap: 8pt) #show figure.caption: set text(size: 8.5pt, fill: rgb("#555")) == 10.5#h(0.6em)Nested dictionaries and dictionary comprehension === Learning objectives By the end of this section you should be able to - Explain the structure of nested dictionaries. - Use dictionary comprehension to create a dictionary object. === Nested dictionaries As described before, Python dictionaries are a type of data structure that allows for storing data in key-value pairs. #strong[Nested dictionaries] are dictionaries that are stored as values within another dictionary. Ex: An organizational chart with keys being different departments and values being dictionaries of employees in a given department. For storing employee information in a department, a dictionary can be used with keys being employee IDs and values being employee names. The tables below outline the structure of such nested dictionaries and how nested values can be accessed. #examplebox("Example 1")[Defining nested dictionaries and accessing elements][ #figure(table( columns: 1, align: left, inset: 6pt, [Defining nested dictionaries], [company\_org\_chart = {   "Marketing": {     "ID234": "Jane Smith"   },   "Sales": {     "ID123": "Bob Johnson",     "ID122": "David Lee"   },   "Engineering": {     "ID303": "Radhika Potlapally",     "ID321": "Maryam Samimi"   } }], )) #figure(table( columns: 1, align: left, inset: 6pt, [Accessing nested dictionary items], [print(company\_org\_chart\["Sales"\]\["ID122"\]) print(company\_org\_chart\["Engineering"\]\["ID321"\]) David Lee Maryam Samimi], )) ] #notebox("Note", rgb("#8a94a6"), rgb("#556666"), rgb("#f7f8fa"))[ #emph[Nested dictionary structure] ] === Dictionary comprehension #strong[Dictionary comprehension] is a concise and efficient way to create a dictionary in Python. With dictionary comprehension, elements of an iterable object are transformed into key-value pairs. The syntax of dictionary comprehension is similar to list comprehension, but instead of using square brackets, curly braces are used to define a dictionary. Here is a general syntax for dictionary comprehension: #notebox("Note", rgb("#8a94a6"), rgb("#556666"), rgb("#f7f8fa"))[ #emph[Syntax for dictionary comprehension] {key\_expression: value\_expression for element in iterable} ] #notebox("Note", rgb("#8a94a6"), rgb("#556666"), rgb("#f7f8fa"))[ #emph[Squares of numbers] #link("https://www.openstax.org/r/squares-of-numbers")[Squares of numbers; ch 10, video 8] ] #notebox("Note", rgb("#8a94a6"), rgb("#556666"), rgb("#f7f8fa"))[ #emph[Dictionary comprehension] ] #notebox("Note", rgb("#8a94a6"), rgb("#556666"), rgb("#f7f8fa"))[ #emph[Product prices] Suppose you have a dictionary of product prices, where the keys are product names and the values are their respective prices in dollars. Write a Python program that uses dictionary comprehension to create a new dictionary that has the same keys as the original dictionary, but the values are the prices in euros. Assume that the exchange rate is 1 dollar = 0.85 euros. prices = {"apple": 1.99, "banana": 0.99, "orange": 2.49, "pear": 1.79} \# Create a dictionary of euro\_prices \# Print the content of the dictionary after the population ] #notebox("Note", rgb("#8a94a6"), rgb("#556666"), rgb("#f7f8fa"))[ #emph[Restructuring the company data] Suppose you have a dictionary that contains information about employees at a company. Each employee is identified by an ID number, and their information includes their name, department, and salary. You want to create a nested dictionary that groups employees by department so that you can easily see the names and salaries of all employees in each department. Write a Python program that when given a dictionary, employees, outputs a nested dictionary, dept\_employees, which groups employees by department. Input: employees = {   1001: {"name": "Alice", "department": "Engineering", "salary": 75000},   1002: {"name": "Bob", "department": "Sales", "salary": 50000},   1003: {"name": "Charlie", "department": "Engineering", "salary": 80000},   1004: {"name": "Dave", "department": "Marketing", "salary": 60000},   1005: {"name": "Eve", "department": "Sales", "salary": 55000} } Resulting dictionary: { "Engineering": {1001: {"name": "Alice", "salary": 75000}, 1003: {"name": "Charlie", "salary": 80000}}, "Sales": {1002: {"name": "Bob", "salary": 50000}, 1005: {"name": "Eve", "salary": 55000}}, "Marketing": {1004: {"name": "Dave", "salary": 60000}} } employees = { 1001: {"name": "Alice", "department": "Engineering", "salary": 75000}, 1002: {"name": "Bob", "department": "Sales", "salary": 50000}, 1003: {"name": "Charlie", "department": "Engineering", "salary": 80000}, 1004: {"name": "Dave", "department": "Marketing", "salary": 60000}, 1005: {"name": "Eve", "department": "Sales", "salary": 55000} } \# Create and populate dept\_employees dictionary \# Print the content of the dictionary after the population ]