#set document(title: "9.4 Nested lists", 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")) == 9.4#h(0.6em)Nested lists === Learning objectives By the end of this section you should be able to - Demonstrate the use of a list-of-lists to structure data. - Demonstrate individual element addressing using multi-dimensional indexing. - Use nested loops to iterate a list-of-lists. === List-of-lists Lists can be made of any type of element. A list element can also be a list. Ex: \[2, \[3, 5\], 17\] is a valid list with the list \[3, 5\] being the element at index 1. When a list is an element inside a larger list, it is called a #strong[nested list]. Nested lists are useful for expressing multidimensional data. When each of the elements of a larger list is a smaller list, the larger list is called a #strong[list-of-lists]. Ex: A table can be stored as a two-dimensional list-of-lists, where each row of data is a list in the list-of-lists. #notebox("Note", rgb("#8a94a6"), rgb("#556666"), rgb("#f7f8fa"))[ #emph[List-of-lists] #link("https://www.openstax.org/r/list-of-lists")[List-of-lists; ch 9, video 4] ] #notebox("Note", rgb("#8a94a6"), rgb("#556666"), rgb("#f7f8fa"))[ #emph[Lists] For each of the questions below, consider the following matrix: #math.equation(block: true, alt: "mat A equals 7, 4, 5; 3, 9, 6; 1, 2, 8")[$"mat A" = 7 & 4 & 5 \ 3 & 9 & 6 \ 1 & 2 & 8$] ] === Using nested loops to iterate nested lists A nested loop structure can be used to iterate a list-of-lists. For a two-dimensional list-of-lists, an outer for loop can be used for rows, and an inner for loop can be used for columns. #examplebox("Example 1")[Iterating a list-of-lists][ The code below demonstrates how to iterate a list-of-lists. The outer loop on line 9 goes element by element for the larger list. Each element in the larger list is a list. The inner loop on line 10 iterates through each element in each nested list. """Iterating a list-of-lists.""" \# Create a list of numbers list1 = \[\[1, 2, 3\],         \[1, 4, 9\],         \[1, 8, 27\]\] \# Iterating the list-of-lists for row in list1:   for num in row:     print(num, end=" ")   print() The above code's output is: 1 2 3 1 4 9 1 8 27 ] #notebox("Note", rgb("#8a94a6"), rgb("#556666"), rgb("#f7f8fa"))[ #emph[Iterating a list-of-lists] For each question below, consider the following list: my\_list = \[\[7, 4, 5, 12\],       \[24, 3, 9, 16\],       \[12, 8, 91, -5\]\] ] #notebox("Note", rgb("#8a94a6"), rgb("#556666"), rgb("#f7f8fa"))[ #emph[Matrix multiplication] Write a program that calculates the matrix multiplication product of the matrices matW and matZ below and prints the result. The expected result is shown. #math.equation(block: true, alt: "mat W equals 13, 4, 5; 2, minus 9, 7; 7, 3, 19 mat Z equals 2, 1, 5; 3, 7, 9; minus 1, 13, 19")[$"mat W" = 13 & 4 & 5 \ 2 & − 9 & 7 \ 7 & 3 & 19 "mat Z" = 2 & 1 & 5 \ 3 & 7 & 9 \ − 1 & 13 & 19$] #math.equation(block: true, alt: "result equals 33, 106, 196; minus 30, 30, 62; 4, 275, 423")[$"result" = 33 & 106 & 196 \ − 30 & 30 & 62 \ 4 & 275 & 423$] In the result matrix, each element is calculated according to the position of the element. The result at position \[i\]\[j\] is calculated using row i from the first matrix, W, and column j from the second matrix, Z. Ex: result\[1\]\[2\] = (row 1 in W) times (column 2 in Z) #math.equation(block: true, alt: "result [ 1 ] [ 2 ] equals 2, -9, 7 * 5; 9; 19")[$"result" [ "1" ] [ "2" ] #h(0.2em) = #h(0.2em) 2 & -9 & 7 #h(0.2em) * #h(0.2em) 5 \ 9 \ 19$] #math.equation(block: true, alt: "result [ 1 ] [ 2 ] equals 2 * 5 plus open parenthesis -9 close parenthesis * 9 plus 7 * 19 equals 10 minus 81 plus 133 equals 62")[$"result" [ 1 ] [ 2 ] = 2 * 5 + ( -9 ) * 9 + 7 * 19 = 10 − 81 + 133 = 62$] \# Create two lists for the matrices W and Z matW = \[\[13,4,5\], \[2,-9,7\], \[7,3,19\]\] matZ = \[\[2,1,5\], \[3,7,9\], \[-1,13,19\]\] ]