Objectives:

Students will be able to...

  • Understand the concept of data structures, including lists, dictionaries, and 2D arrays
  • Learn how to iterate through data structures using loops
  • Able to visualize data structures and iteration processes
  • Able to apply their knowledge to build simulations/interactions using lists and iteration
  • Learn how to store list and dictionary content in databases

Lesson 1: Lists and Iteration

Lists (Ethan)

  • Lists are a type of data structure that can store multiple items in a single variable
  • Lists are defined using square brackets [ ]
  • Each item in a list is separated by a comma
  • Lists are indexed, starting at 0
fruits = ["apple", "banana", "orange", "grape"]
print(fruits)
['apple', 'banana', 'orange', 'grape']

Accessing Lists

  • To access individual items in a list, we use the index of the item.
  • Python uses zero-based indexing, which means the first item in the list has an index of 0, the second item has an index of 1, and so on.
print(fruits[0])   
print(fruits[2]) 
apple
orange

Slicing Lists

  • We can also extract a specific portion of a list using slicing.
  • We use the colon : operator to specify a range of indices to include.
print(fruits[0:2])    
['apple', 'banana']

Modifying List Items

  • Lists are mutable, meaning that we can change the value of an item in a list.
  • To change the value of an item in a list, we can use the indexing operator (square brackets) to access the item and then assign a new value to it.
fruits[2] = "pear"
print(fruits)
['apple', 'banana', 'pear', 'grape', 'kiwi']

Adding and Removing List Items

Adding

  • Use the append() method to add an item to the end of a list.
fruits.append("kiwi") # Adds 'kiwi' to the end of the list
print(fruits)
['apple', 'banana', 'pear', 'grape', 'kiwi', 'kiwi']
  • Use the insert() method to add an item to a specific index in a list.
fruits.insert(1, "peach") # Inserts "peach" at index 1
print(fruits)
['apple', 'peach', 'banana', 'pear', 'grape', 'kiwi', 'kiwi']

Removing

  • Use the remove() method to remove the first occurrence of an item from a list.
fruits.remove('pear') # Removes the first occurrence of 'pear'
print(fruits)
['apple', 'peach', 'banana', 'grape', 'kiwi', 'kiwi']
  • Use the pop() method to remove the item at a specific index from a list.
fruits.pop(2) # Removes the item at index 2
print(fruits)
['apple', 'peach', 'grape', 'kiwi', 'kiwi']
  • Use the clear() method to remove all items from a list.
fruits.clear() # Removes all items from the list
print(fruits)
[]

Function Explanation

InsertToList

  • This function is designed to insert a new item into a list at a specific index.
  • It first retrieves the new item to be added and the index at which to add it from the HTML document.
  • It checks if the retrieved values are both valid integers and if the index is within the range of the list.
  • If the values are valid, the function uses the splice() method to insert the new item into the list at the specified index.
  • In JavaScript, the splice() method modifies an array by removing, replacing, or adding elements.
  • The splice() method takes three arguments:the index at which to start changing the list, the number of elements to remove, and the new item to add. - The item is inserted without removing any elements, so we pass 0 as the second argument.
  • Finally, the function calls the visualizeList() function to display the updated list on the web page.
  // Get the value of the new item and the index where it should be inserted
  function insertToList() {
      let newItem = parseInt(document.getElementById("newItem").value);
      let index = parseInt(document.getElementById("index").value);
      if (!isNaN(newItem) && !isNaN(index) && index >= 0 && index <= myList.length) {
        // splice() method to insert the new item into the list
        myList.splice(index - 1, 0, newItem);
        // Call the visualizeList() function to update the display of the list
        visualizeList();
      }
    }

SortList

  • In JavaScript, sort() is a built-in method used to sort the elements of an array in place. The default sort order is ascending, but you can also specify a descending sort order.
  • In this case, the function sorts myList in ascending order based on their numerical value.
  // Sort myList array in ascending order     
  function sortList() {
      // The function a - b is used, which subtracts the second element b from the first element a. 
      // If the result is negative, a is sorted before b. If the result is positive, b is sorted before a. If the result is zero, the order of the elements is unchanged.
      myList.sort((a, b) => a - b);
      visualizeList();
    }

Applications of Lists

  • Data processing: Lists are commonly used to store and process large amounts of data. In data analysis and machine learning, lists are often used to store datasets.

  • Gaming: Lists are used extensively in game development to store game objects, player statistics, and game maps.

  • Finance: Lists are used in finance to store and process financial data, such as stock prices and market trends. The data from these lists can also be used to calculate financial metrics and to create financial models.

Hacks (0.3)

  • Make your own list and manipulate it via accessing specific elements, adding or removing elements, etc.
  • Extra: Make an interactable visualization that can manipulate elements in a list such as the one demonstrated in our flask repository
def board(bingo, dimension):
    for i in range(dimension):
        print(' _', end = '')
    for i in range(dimension):
        print()
        print('|', end = '')
        for j in range(dimension):
            print(bingo[i][j] + '|', end = '')
    print()


while True:
    dimension = int(input("Please input the size of the game board(more than 2): "))
    if dimension <= 2 :
        print('[Error] try again')
    else:
        break

bingo = [['_']*dimension for i in range(dimension)]
board(bingo, dimension)

turn = 1
play_count = 0
while True:
    print('<Play no.{}>'.format(play_count+1))
    if turn == 1:
        print('Currently player: 1')
        row_1 = int(input('Which row?(start with 1)'))
        column_1 = int(input('Which column?(start with 1)'))

        if bingo[row_1-1][column_1-1] != '_':
            print('Space is not empty. Try again')
            turn = 1
            continue
        else:
            bingo[row_1-1][column_1-1] = 'O'
            board(bingo,dimension)
            turn = 2

    elif turn == 2:
        print('Currently player: 2')
        row_2 = int(input('Which row?(start with 1) '))
        column_2 = int(input('Which column?(start with 1) '))

        if bingo[row_2-1][column_2-1] != '_':
            print('Space is not empty. Try again')
            turn = 2
            continue
        else:
            bingo[row_2-1][column_2-1] = 'X'
            board(bingo,dimension)
            turn = 1

    check_diag = []
    check_reverse = []
    check_row = []
    check_column =[]
            
    for i in range(dimension):
        check_diag.append(bingo[i][i])
        check_reverse.append(bingo[dimension-i-1][i])
        

        for j in range(dimension):
            check_row.append(bingo[i][j])
            check_column.append(bingo[j][i])
        
        if set(check_row) == {'O'}:
            print('Player 1 wins!')
            turn = 0
        elif set(check_row) == {'X'}:
            print('Player 2 wins!')
            turn = 0

        check_row = []

        if set(check_column) == {'O'}:
            print('Player 1 wins!')
            turn = 0
        elif set(check_column) == {'X'}:
            print('Player 2 wins!')
            turn = 0
        check_column = []

    check_diag = set(check_diag)
    check_reverse = set(check_reverse)

    if check_diag == {'O'} or check_reverse == {'O'}:
        print('Player 1 wins!')
        turn = 0
        
    elif check_diag == {'X'} or check_reverse == {'X'}:
        print('Player 2 wins!')
        turn = 0

    play_count += 1


    if turn == 0 or play_count == dimension**2:
        print('Finish')
        break
[Error] try again
[Error] try again
 _ _ _
|_|_|_|
|_|_|_|
|_|_|_|
<Play no.1>
Currently player: 1
 _ _ _
|_|_|_|
|_|_|_|
|O|_|_|
<Play no.2>
Currently player: 2
 _ _ _
|_|X|_|
|_|_|_|
|O|_|_|
<Play no.3>
Currently player: 1
Space is not empty. Try again
<Play no.3>
Currently player: 1
 _ _ _
|_|X|_|
|_|_|_|
|O|O|_|
<Play no.4>
Currently player: 2
 _ _ _
|X|X|_|
|_|_|_|
|O|O|_|
<Play no.5>
Currently player: 1
 _ _ _
|X|X|_|
|_|_|_|
|O|O|O|
Player 1 wins!
Finish

Iteration (Alex)

What is iteration?

  • In programming, iteration refers to the process of repeating a set of instructions until a specific condition is met. This can be achieved using loop structures like for loops and while loops.

For Loops

  • A for loop is used to iterate over a sequence (e.g. a list, tuple, string, etc.) and execute a set of statements for each item in the sequence. Here's the basic syntax of a for loop in Python:
sequence = [1,2,3,4,5,6,7]
for variable in sequence:
    print(variable)
1
2
3
4
5
6
7
my_string = "Hello, World!"

for character in my_string:
    print(character)
H
e
l
l
o
,
 
W
o
r
l
d
!

While Loops A while loop is used to repeat a set of statements as long as a condition is true. Here's the basic syntax of a while loop in Python:

num = 0

while num < 5:
    print(num)
    num += 1
0
1
2
3
4

Applications of Iteration

Iteration is a fundamental concept in computer programming and is used in a variety of real-life applications. Here are some examples:Data Processing

  • Data processing often involves iterating over large datasets to perform specific operations on each element. For example, in a data analysis task, you might iterate over a list of numbers to compute the average, or iterate over a list of strings to find the longest string.

User Interfaces

  • User interfaces often involve iteration to display and handle data from various sources. For example, in a web application, you might iterate over a list of users to display their information in a table. Similarly, in a desktop application, you might iterate over a list of files to display them in a file explorer.

Machine Learning

  • Machine learning algorithms often involve iterative processes to train models and improve their accuracy. For example, in a gradient descent algorithm, you might iterate over a set of training data to update the model's parameters and minimize the loss function.

Popcorn hack (0.3)

  • Make a list related to your CPT project
  • Make a while loop that will print each term in the list
  • Make a for loop that will print each term in the list

Simulation mechanics

  • In Python, pop() is a method that is used to remove and return an element from a list. The syntax for using pop() is as follows:
def make_id(regist_user):
    regist_id = []
    while True:
        uid = str(input('user id input: '))
        if uid in regist_user:
            print('Already registered')
            ex = input('Are you going to register? (y/n): ')
            if ex == 'y' or ex == 'Y':
                return False
            else:
                continue
        else:
            res_id = chk_id(uid)
            if not res_id:
                continue
            else:
                regist_id.append(uid)
                break
    # print(regist_id)

    while True:
        pwd = str(input('password input: '))
        res_pwd = chk_password(pwd)
        if not res_pwd:
            continue
        else:
            regist_id.append(pwd)
            break
    # print(regist_id)
    return regist_id
def edit_password(uid, pwd):
    n_pwd = ''
    while True:
        pw = str(input('new password input: '))
        if pw == pwd:
            print(f'same password!')
            continue
        else:
            res_pwd = chk_password(pw)
            if not res_pwd:
                continue
            else:
                n_pwd = pw
                break
    print(f'id:{uid}, n_pwd:{n_pwd}')
    return uid, n_pwd
import re

def chk_id(id):
    result = True
    reg = r'^[A-Za-z0-9_]{4,20}$'
    if not re.search(reg, id):
        print('this Id is not proper!')
        result = False
    return result


def chk_password(pwd):
    result = True
    reg = r'^(?=.*[A-Za-z])(?=.*\d)(?=.*[!@#$%&*?])[A-Za-z\d!@#$%&*?]{8,20}$'
    if not re.search(reg, pwd):
        print('password is not proper')
        result = False
    return result
def main():
    regist_user = {'haha':'gkgkgh!!11'}
    sw = True

    while sw:
        print('-----------------------------')
        print('1. making username')
        print('2. changing password')
        print('3. look at the list')
        print('4. end')
        print('-----------------------------\n')  

        select_no = int(input('select number (1~4): '))

        if select_no == 1:
            id_result = make_id(regist_user)
            if id_result:
                regist_user[id_result[0]] = id_result[1]
                print(regist_user)

        if select_no == 2:
            uid = str(input('user id: '))
            if uid in regist_user:
                print(f'{uid} / {regist_user[uid]}')
                n_pwd = edit_password(uid, regist_user[uid])
                regist_user[uid] = n_pwd
                print('Password changed!\n')
            else:
                print('Not register id.\n')
                continue

        if select_no == 3:
            for k, v in regist_user.items():
                print(f'id: {k} / pw: {v}')
            print()
    
        if select_no == 4:
            sw = False

main()
-----------------------------
1. making username
2. changing password
3. look at the list
4. end
-----------------------------

password is not proper
{'haha': 'gkgkgh!!11', 'James0905': 'Qwerasdf77!'}
-----------------------------
1. making username
2. changing password
3. look at the list
4. end
-----------------------------

my_list = [1, 2, 3, 4, 5]
print(my_list)
my_list.pop()
print(my_list)
my_list.pop(1)
print(my_list)
[1, 2, 3, 4, 5]
[1, 2, 3, 4]
[1, 3, 4]

In Python, append() is a built-in method that is used to add an element to the end of a list. The syntax for using append() is as follows:

my_list = []
my_list.append(1)
my_list.append(2)
my_list.append(3)
print(my_list)
[1, 2, 3]

Dictionary Lesson / 2D Arrays

Lesson 2: Dictionary's and 2 Dimensional Arrays

Advay Shindikar and Amay Advani

Objective:

  • Understand the concept of dictionaries and how they can be applied
  • Learn how to add, modify, and delete entries in a dictionary using the assignment operator and the del keyword
  • Understand the concept of 2D arrays and how they can be used to store data in rows and columns
  • Learn how to create a 2D array in Python using a nested list
  • Understand how to access values in a 2D array using row and column indices
  • Learn how to use indexing and slicing to access a subset of a 2D array

student = {'name': 'Advay', 'age': 16, 'Sophomore'}
students = ['advay', 'amay', 'rohin', 'alex', 'ethan']

Check In:

  • Of the above code segments, which is a list and which is a dictionary?
  • What is a dictionary and how is it used?
  • What is a 2D Array?
  • How are 2D Arrays different from 1D Arrays or Lists and what can they be used for?

Manipulating Dictionaries

grocery_dict = {}

# ask the user to enter grocery items and their prices
while True:
    item = input("Enter an item for your grocery list (or 'done' to exit): ")
    if item == "done":
        break
    else:
        price = float(input("Enter the price of {}: ".format(item)))
        grocery_dict[item] = price

# print the grocery list and total cost
total_cost = 0
while True:
    print("Your grocery list:")
    for item, price in grocery_dict.items():
        print("- {}: ${}".format(item, price))
    print("Total cost: ${}".format(total_cost))
    
    # ask the user to choose an action
    action = input("What would you like to do? (add/remove/done) ")
    
    # add a new item to the grocery list
    if action == "add":
        item = input("Enter the name of the item you would like to add: ")
        price = float(input("Enter the price of {}: ".format(item)))
        grocery_dict[item] = price
        total_cost += price
    
    # remove an item from the           j
        item = input("Enter the name of the item you would like to remove: ")
        if item in grocery_dict:
            total_cost -= grocery_dict[item]
            del grocery_dict[item]
        else:
            print("Item not found in grocery list!")
    
    # exit the loop and print the final grocery list and total cost
    elif action == "done":
        break

print("Final grocery list:")
for item, price in grocery_dict.items():
    print("- {}: ${}".format(item, price))
print("Total cost: ${}".format(total_cost))

2D Array

n = 6
my_array = [[0 for i in range(n)] for j in range(n)]

x, y = 0, 0
dx, dy = 0, 1

for i in range(n*n):
    my_array[x][y] = i+1
    if x+dx < 0 or x+dx >= n or y+dy < 0 or y+dy >= n or my_array[x+dx][y+dy] != 0:
        dx, dy = dy, -dx
    x, y = x+dx, y+dy

for row in my_array:
    for item in row:
        print("{:3d}".format(item), end=" ")
    print()
  1   2   3   4   5   6 
 20  21  22  23  24   7 
 19  32  33  34  25   8 
 18  31  36  35  26   9 
 17  30  29  28  27  10 
 16  15  14  13  12  11 
from tabulate import tabulate
from PIL import Image, ImageDraw
import random


data = []


def generate_array(rows, cols):
    global data
    new_data = []
    for row in range(rows):
        row_data = []
        for col in range(cols):
            if row < len(data) and col < len(data[row]):
                row_data.append(data[row][col])
            else:
                row_data.append(random.randint(0, 255))
        new_data.append(row_data)
    data = new_data
    draw_array()


def draw_array():
    table = []
    max_value = max(max(row) for row in data)
    image_width = len(data[0]) * 50
    image_height = len(data) * 50
    image = Image.new("RGB", (image_width, image_height))
    draw = ImageDraw.Draw(image)
    for row in range(len(data)):
        row_values = []
        for col in range(len(data[row])):
            value = data[row][col]
            cell_color = (value, value, value)
            draw.rectangle([(col * 50, row * 50), ((col + 1) * 50, (row + 1) * 50)], fill=cell_color)
            row_values.append(value)
        table.append(row_values)
    print(tabulate(table, tablefmt="grid"))
    image.show()

rows = int(input("Enter the number of rows (1-10): "))
cols = int(input("Enter the number of columns (1-10): "))
generate_array(rows, cols)
+-----+-----+-----+
|  22 | 174 |  70 |
+-----+-----+-----+
| 142 | 217 | 122 |
+-----+-----+-----+
| 250 | 246 | 218 |
+-----+-----+-----+