A set holds each value once, in no particular order: set(["C14", "C20", "C14"]) is {"C14", "C20"}. That makes sets the quick way to remove duplicates and to compare groups. a & b gives what's in both, a | b what's in either, and a - b what's in a but not b. Checking x in a_set is fast even for large sets. Sets have no positions, so s[0] doesn't work.
A tuple is like a list that can't change: shift = ("Amara", "2026-02-03", 9.5). Use one for a fixed record, or to return several values from a function. Unpacking gives each part a name in one line: name, day, hours = shift. The number of names must match the number of values.
Lists and sets can't be dictionary keys, but tuples can: {("West", "Q1"): 1200}.
monday = {"Priya", "Mateo", "Aisha"}
tuesday = {"Mateo", "Kenji"}
both = monday & tuesday
name, day, hours = ("Kenji", "Tue", 7.5)
both, name, hours
Out: ({'Mateo'}, 'Kenji', 7.5). & keeps the names in both sets, and unpacking names each part of the tuple.