What is a Hashtable/Hashmap?

A hashtable is a data structure that with a collection of key-value pairs, where each key maps to a value, and the keys must be unique and hashable.

  • In Python there is a built in hashtable known as a dictonary.

The primary purpose of a hashtable is to provide efficient lookup, insertion, and deletion operations. When an element is to be inserted into the hashtable, a hash function is used to map the key to a specific index in the underlying array that is used to store the key-value pairs. The value is then stored at that index. When searching for a value, the hash function is used again to find the index where the value is stored.

The key advantage of a hashtable over other data structures like arrays and linked lists is its average-case time complexity for lookup, insertion, and deletion operations.

  • The typical time complexity of a hashtable is O(1).

What is Hashing and Collision?

Hashing is the process of mapping a given key to a value in a hash table or hashmap, using a hash function. The hash function takes the key as input and produces a hash value or hash code, which is then used to determine the index in the underlying array where the value is stored. The purpose of hashing is to provide a quick and efficient way to access data, by eliminating the need to search through an entire data structure to find a value.

However, it is possible for two different keys to map to the same hash value, resulting in a collision. When a collision occurs, there are different ways to resolve it, depending on the collision resolution strategy used.

Python's dictionary implementation is optimized to handle collisions efficiently, and the performance of the dictionary is generally very good, even in the presence of collisions. However, if the number of collisions is very high, the performance of the dictionary can degrade, so it is important to choose a good hash function that minimizes collisions when designing a Python dictionary.

What is a Set?

my_set = set([1, 2, 3, 2, 1])
print(my_set)  

# What do you notice in the output?
# I notice that the output is 123 showing that a set is a list that doesen't repeat again. 
#

# Why do you think Sets are in the same tech talk as Hashmaps/Hashtables?
# They are in the same techtalk as hasmaps due to the fact that hashmaps are out of dictionaries which are a bit differet from 
#
{1, 2, 3}

Dictionary Example

Below are just some basic features of a dictionary. As always, documentation is always the main source for all the full capablilties.

lover_album = {
    "title": "Lover",
    "artist": "Taylor Swift",
    "year": 2019,
    "genre": ["Pop", "Synth-pop"],
    "tracks": {
        1: "I Forgot That You Existed",
        2: "Cruel Summer",
        3: "Lover",
        4: "The Man",
        5: "The Archer",
        6: "I Think He Knows",
        7: "Miss Americana & The Heartbreak Prince",
        8: "Paper Rings",
        9: "Cornelia Street",
        10: "Death By A Thousand Cuts",
        11: "London Boy",
        12: "Soon You'll Get Better (feat. Dixie Chicks)",
        13: "False God",
        14: "You Need To Calm Down",
        15: "Afterglow",
        16: "Me! (feat. Brendon Urie of Panic! At The Disco)",
        17: "It's Nice To Have A Friend",
        18: "Daylight"
    }
}

# What data structures do you see?
# I see a dictionary due to the fact it uses curly brakets and integers and strings within it. 
#

# Printing the dictionary
print(lover_album)
{'title': 'Lover', 'artist': 'Taylor Swift', 'year': 2019, 'genre': ['Pop', 'Synth-pop'], 'tracks': {1: 'I Forgot That You Existed', 2: 'Cruel Summer', 3: 'Lover', 4: 'The Man', 5: 'The Archer', 6: 'I Think He Knows', 7: 'Miss Americana & The Heartbreak Prince', 8: 'Paper Rings', 9: 'Cornelia Street', 10: 'Death By A Thousand Cuts', 11: 'London Boy', 12: "Soon You'll Get Better (feat. Dixie Chicks)", 13: 'False God', 14: 'You Need To Calm Down', 15: 'Afterglow', 16: 'Me! (feat. Brendon Urie of Panic! At The Disco)', 17: "It's Nice To Have A Friend", 18: 'Daylight'}}
print(lover_album.get('tracks'))
# or
print(lover_album['tracks'])
{1: 'I Forgot That You Existed', 2: 'Cruel Summer', 3: 'Lover', 4: 'The Man', 5: 'The Archer', 6: 'I Think He Knows', 7: 'Miss Americana & The Heartbreak Prince', 8: 'Paper Rings', 9: 'Cornelia Street', 10: 'Death By A Thousand Cuts', 11: 'London Boy', 12: "Soon You'll Get Better (feat. Dixie Chicks)", 13: 'False God', 14: 'You Need To Calm Down', 15: 'Afterglow', 16: 'Me! (feat. Brendon Urie of Panic! At The Disco)', 17: "It's Nice To Have A Friend", 18: 'Daylight'}
{1: 'I Forgot That You Existed', 2: 'Cruel Summer', 3: 'Lover', 4: 'The Man', 5: 'The Archer', 6: 'I Think He Knows', 7: 'Miss Americana & The Heartbreak Prince', 8: 'Paper Rings', 9: 'Cornelia Street', 10: 'Death By A Thousand Cuts', 11: 'London Boy', 12: "Soon You'll Get Better (feat. Dixie Chicks)", 13: 'False God', 14: 'You Need To Calm Down', 15: 'Afterglow', 16: 'Me! (feat. Brendon Urie of Panic! At The Disco)', 17: "It's Nice To Have A Friend", 18: 'Daylight'}
print(lover_album.get('tracks')[4])
# or
print(lover_album['tracks'][4])
The Man
The Man
lover_album["producer"] = set(['Taylor Swift', 'Jack Antonoff', 'Joel Little', 'Taylor Swift', 'Louis Bell', 'Frank Dukes'])

# What can you change to make sure there are no duplicate producers?
# you can add a set() in offer to make sure that there are duplicates as produces a value one time.
#

# Printing the dictionary
print(lover_album)
{'title': 'Lover', 'artist': 'Taylor Swift', 'year': 2019, 'genre': ['Pop', 'Synth-pop'], 'tracks': {1: 'I Forgot That You Existed', 2: 'Cruel Summer', 3: 'Lover', 4: 'The Man', 5: 'The Archer', 6: 'I Think He Knows', 7: 'Miss Americana & The Heartbreak Prince', 8: 'Paper Rings', 9: 'Cornelia Street', 10: 'Death By A Thousand Cuts', 11: 'London Boy', 12: "Soon You'll Get Better (feat. Dixie Chicks)", 13: 'False God', 14: 'You Need To Calm Down', 15: 'Afterglow', 16: 'Me! (feat. Brendon Urie of Panic! At The Disco)', 17: "It's Nice To Have A Friend", 18: 'Daylight', 19: 'All Of The Girls You Loved Before'}, 'producer': {'Louis Bell', 'Taylor Swift', 'Joel Little', 'Jack Antonoff', 'Frank Dukes'}}
lover_album["tracks"].update({19: "All Of The Girls You Loved Before"})
lover_album["genre"].append("electropop")
# How would add an additional genre to the dictionary, like electropop? 
# you would have to add update. genre and wihtin that you put it into a set 
# 

# Printing the dictionary
print(lover_album)
{'title': 'Lover', 'artist': 'Taylor Swift', 'year': 2019, 'genre': ['Pop', 'Synth-pop', {'electropop'}, 'electropop', 'electropop'], 'tracks': {1: 'I Forgot That You Existed', 2: 'Cruel Summer', 3: 'Lover', 4: 'The Man', 5: 'The Archer', 6: 'I Think He Knows', 7: 'Miss Americana & The Heartbreak Prince', 8: 'Paper Rings', 9: 'Cornelia Street', 10: 'Death By A Thousand Cuts', 11: 'London Boy', 12: "Soon You'll Get Better (feat. Dixie Chicks)", 13: 'False God', 14: 'You Need To Calm Down', 15: 'Afterglow', 16: 'Me! (feat. Brendon Urie of Panic! At The Disco)', 17: "It's Nice To Have A Friend", 18: 'Daylight', 19: 'All Of The Girls You Loved Before'}, 'producer': {'Louis Bell', 'Taylor Swift', 'Joel Little', 'Jack Antonoff', 'Frank Dukes'}}
#for k,v in lover_album.items(): # iterate using a for loop for key and value
   # print(str(k) + ": " + str(v))

# Write your own code to print tracks in readable format
for k,v in lover_album["tracks"].items():
    print(k,":",v)
1 : I Forgot That You Existed
2 : Cruel Summer
3 : Lover
4 : The Man
5 : The Archer
6 : I Think He Knows
7 : Miss Americana & The Heartbreak Prince
8 : Paper Rings
9 : Cornelia Street
10 : Death By A Thousand Cuts
11 : London Boy
12 : Soon You'll Get Better (feat. Dixie Chicks)
13 : False God
14 : You Need To Calm Down
15 : Afterglow
16 : Me! (feat. Brendon Urie of Panic! At The Disco)
17 : It's Nice To Have A Friend
18 : Daylight
19 : All Of The Girls You Loved Before
def search():
    search = input("What would you like to know about the album?")
    if lover_album.get(search.lower()) == None:
        print("Invalid Search check spelling and other possible outputs.")
    else:
        print(lover_album.get(search.lower()))

search()

# This is a very basic code segment, how can you improve upon this code? 
# We can make this more readable and better 
#
['Pop', 'Synth-pop', {'electropop'}, 'electropop', 'electropop']
def search2():
    search = input("What would you like to know more about")
    if search == "artist":
        print(f"this is the artist",lover_album.get(search))
    elif search  == "genre":
        print(f"this is the genre",lover_album.get(search))
    elif search  == "title":
        print(f"this is the title",lover_album.get(search))
    elif search  == "tracks":
        print(f"this is the producer",lover_album.get(search))
    elif search  == "track":
        print(f"this is the track",lover_album.get(search))
    elif search  == "producer":
        print(f"this is the producer",lover_album.get(search))

search2()
this is the artist Taylor Swift

Hacks

  • Answer ALL questions in the code segments
  • Create a diagram or comparison illustration (Canva).
    • What are the pro and cons of using this data structure?
    • Dictionary vs List
  • Expand upon the code given to you, possible improvements in comments
  • Build your own album showing features of a python dictionary

  • For Mr. Yeung's class: Justify your favorite Taylor Swift song, answer may effect seed

more_life_songs = {
    "title": "More Life",
    "artist": "Drake",
    "year": 2017,
    "genre": ["Rap", "HipHop"],
    "1": "Free Smoke",
    "2": "No Long Talk (feat. Giggs)",
    "3": "Passionfruit",
    "4": "Jorja Interlude (feat. Jorja Smith)",
    "5": "Get It Together (feat. Black Coffee & Jorja Smith)",
    "6": "Madiba Riddim",
    "7": "Blem",
    "8": "4422 (feat. Sampha)",
    "9": "Gyalchester",
    "10": "Skepta Interlude (feat. Skepta)",
    "11": "Portland (feat. Quavo & Travis Scott)",
    "12": "Sacrifices (feat. 2 Chainz & Young Thug)",
    "13": "Nothings Into Somethings",
    "14": "Teenage Fever",
    "15": "KMT (feat. Giggs)",
    "16": "Lose You",
    "17": "Can't Have Everything",
    "18": "Glow (feat. Kanye West)",
    "19": "Since Way Back (feat. PARTYNEXTDOOR)",
    "20": "Fake Love",
    "21": "Ice Melts (feat. Young Thug)",
    "22": "Do Not Disturb"
}
print (more_life_songs)
{'title': 'More Life', 'artist': 'Drake', 'year': 2017, 'genre': ['Rap', 'HipHop'], '1': 'Free Smoke', '2': 'No Long Talk (feat. Giggs)', '3': 'Passionfruit', '4': 'Jorja Interlude (feat. Jorja Smith)', '5': 'Get It Together (feat. Black Coffee & Jorja Smith)', '6': 'Madiba Riddim', '7': 'Blem', '8': '4422 (feat. Sampha)', '9': 'Gyalchester', '10': 'Skepta Interlude (feat. Skepta)', '11': 'Portland (feat. Quavo & Travis Scott)', '12': 'Sacrifices (feat. 2 Chainz & Young Thug)', '13': 'Nothings Into Somethings', '14': 'Teenage Fever', '15': 'KMT (feat. Giggs)', '16': 'Lose You', '17': "Can't Have Everything", '18': 'Glow (feat. Kanye West)', '19': 'Since Way Back (feat. PARTYNEXTDOOR)', '20': 'Fake Love', '21': 'Ice Melts (feat. Young Thug)', '22': 'Do Not Disturb'}
more_life_songs = {
    "title": "More Life",
    "artist": "Drake",
    "year": 2017,
    "genre": ["Rap", "HipHop"],
    "tracks": {
    1: "Free Smoke",
    2: "No Long Talk (feat. Giggs)",
    3: "Passionfruit",
    4: "Jorja Interlude (feat. Jorja Smith)",
    5: "Get It Together (feat. Black Coffee & Jorja Smith)",
    6: "Madiba Riddim",
    7: "Blem",
    8: "4422 (feat. Sampha)",
    9: "Gyalchester",
    10: "Skepta Interlude (feat. Skepta)",
    11: "Portland (feat. Quavo & Travis Scott)",
    12: "Sacrifices (feat. 2 Chainz & Young Thug)",
    13: "Nothings Into Somethings",
    14: "Teenage Fever",
    15: "KMT (feat. Giggs)",
    16: "Lose You",
    17: "Can't Have Everything",
    18: "Glow (feat. Kanye West)",
    19: "Since Way Back (feat. PARTYNEXTDOOR)",
    20: "Fake Love",
    21: "Ice Melts (feat. Young Thug)",
    22: "Do Not Disturb"
    }
}

print(more_life_songs['tracks'][8])
4422 (feat. Sampha)
more_life_songs["producer"] = set(['Drake', 'Noah', 'Shebib', 'Boi-1da', 'Vinylz', 'Allen Ritter', 'Frank Dukes', 'Nineteen85', 'Kanye West'])

print(more_life_songs)
{'title': 'More Life', 'artist': 'Drake', 'year': 2017, 'genre': ['Rap', 'HipHop'], 'tracks': {1: 'Free Smoke', 2: 'No Long Talk (feat. Giggs)', 3: 'Passionfruit', 4: 'Jorja Interlude (feat. Jorja Smith)', 5: 'Get It Together (feat. Black Coffee & Jorja Smith)', 6: 'Madiba Riddim', 7: 'Blem', 8: '4422 (feat. Sampha)', 9: 'Gyalchester', 10: 'Skepta Interlude (feat. Skepta)', 11: 'Portland (feat. Quavo & Travis Scott)', 12: 'Sacrifices (feat. 2 Chainz & Young Thug)', 13: 'Nothings Into Somethings', 14: 'Teenage Fever', 15: 'KMT (feat. Giggs)', 16: 'Lose You', 17: "Can't Have Everything", 18: 'Glow (feat. Kanye West)', 19: 'Since Way Back (feat. PARTYNEXTDOOR)', 20: 'Fake Love', 21: 'Ice Melts (feat. Young Thug)', 22: 'Do Not Disturb'}, 'producer': {'Shebib', 'Noah', 'Allen Ritter', 'Frank Dukes', 'Nineteen85', 'Drake', 'Vinylz', 'Kanye West', 'Boi-1da'}}
more_life_songs["genre"].append("afrobeats")
print(more_life_songs)
{'title': 'More Life', 'artist': 'Drake', 'year': 2017, 'genre': ['Rap', 'HipHop', 'afrobeats'], 'tracks': {1: 'Free Smoke', 2: 'No Long Talk (feat. Giggs)', 3: 'Passionfruit', 4: 'Jorja Interlude (feat. Jorja Smith)', 5: 'Get It Together (feat. Black Coffee & Jorja Smith)', 6: 'Madiba Riddim', 7: 'Blem', 8: '4422 (feat. Sampha)', 9: 'Gyalchester', 10: 'Skepta Interlude (feat. Skepta)', 11: 'Portland (feat. Quavo & Travis Scott)', 12: 'Sacrifices (feat. 2 Chainz & Young Thug)', 13: 'Nothings Into Somethings', 14: 'Teenage Fever', 15: 'KMT (feat. Giggs)', 16: 'Lose You', 17: "Can't Have Everything", 18: 'Glow (feat. Kanye West)', 19: 'Since Way Back (feat. PARTYNEXTDOOR)', 20: 'Fake Love', 21: 'Ice Melts (feat. Young Thug)', 22: 'Do Not Disturb'}}
for k,v in more_life_songs["tracks"].items():
    print(k,":",v)
1 : Free Smoke
2 : No Long Talk (feat. Giggs)
3 : Passionfruit
4 : Jorja Interlude (feat. Jorja Smith)
5 : Get It Together (feat. Black Coffee & Jorja Smith)
6 : Madiba Riddim
7 : Blem
8 : 4422 (feat. Sampha)
9 : Gyalchester
10 : Skepta Interlude (feat. Skepta)
11 : Portland (feat. Quavo & Travis Scott)
12 : Sacrifices (feat. 2 Chainz & Young Thug)
13 : Nothings Into Somethings
14 : Teenage Fever
15 : KMT (feat. Giggs)
16 : Lose You
17 : Can't Have Everything
18 : Glow (feat. Kanye West)
19 : Since Way Back (feat. PARTYNEXTDOOR)
20 : Fake Love
21 : Ice Melts (feat. Young Thug)
22 : Do Not Disturb
def search3():
    search = input("What would you like to know more about")
    if search == "artist":
        print(f"this is the artist",more_life_songs.get(search))
    elif search  == "genre":
        print(f"this is the genre",more_life_songs.get(search))
    elif search  == "title":
        print(f"this is the title",more_life_songs.get(search))
    elif search  == "tracks":
        print(f"this is the producer",more_life_songs.get(search))
    elif search  == "track":
        print(f"this is the track",more_life_songs.get(search))
    elif search  == "producer":
        print(f"this is the producer",more_life_songs.get(search))

search3()
this is the producer {1: 'Free Smoke', 2: 'No Long Talk (feat. Giggs)', 3: 'Passionfruit', 4: 'Jorja Interlude (feat. Jorja Smith)', 5: 'Get It Together (feat. Black Coffee & Jorja Smith)', 6: 'Madiba Riddim', 7: 'Blem', 8: '4422 (feat. Sampha)', 9: 'Gyalchester', 10: 'Skepta Interlude (feat. Skepta)', 11: 'Portland (feat. Quavo & Travis Scott)', 12: 'Sacrifices (feat. 2 Chainz & Young Thug)', 13: 'Nothings Into Somethings', 14: 'Teenage Fever', 15: 'KMT (feat. Giggs)', 16: 'Lose You', 17: "Can't Have Everything", 18: 'Glow (feat. Kanye West)', 19: 'Since Way Back (feat. PARTYNEXTDOOR)', 20: 'Fake Love', 21: 'Ice Melts (feat. Young Thug)', 22: 'Do Not Disturb'}

Taylor Swift Song

  • My favorite taylor swift song is LAVENDER HAZE! This is becuase it pumps me up and my energy and gives me a boost when doing homework and when I am preparing for a soccer game. In addition the tone of the song reminds me of summer as it has a happy bass in the back and uses a lot of radio tone which is always pleasent within music. In addition to this has been recently added to my liked songs as I was listening to this song on loop while completing these hacks. To be really honest I didint know much about taylor swift prior to this however my sister is a certified swiftie and has educated me about this amazing artist in addition I will continue to listen to her songs. Some of my honorable mentions are ANTI HERO, BAD BLOOD, and LOVE STORY.