Collections

This is a cheatsheet of Python’s collection classes.

Summary Comparison

|Action|List|Tuple|Set|Dictionary| |——|—-|—–|—|———-| |Create|a = [ ]
a = list()
a = [1, 2]|t = () # empty
t = tuple()
t = (1, 2)|s = set( )
s = {1, 2}|d = { }
d = dict( )
d = { k1:v1, k2:v2 }
d = dict(dict2)| |Add
Insert|a.append(obj)
a.insert(idx, obj)|t = t + ( obj, )|s.add(3)|d['b'] = 2| |Contains|if obj in a|if obj in t|if obj in s|if key in d| |Remove|a.remove(obj)
a.pop(index)
a.pop()|NA|s.remove(obj)
s.pop()
s.discard('value')|d.pop(key)
d.pop(key, def_val)
del d[key]
d.popitem()| |Get
Set|v = a[index]|v = t[index]
i1, i2 = t
i1, *mid, i2 = t
i1, *last = t|NA|v = d['a']
v = d.get('a', v)|

List

|Operation|API| |———|—| |Create|my_list = []
my_list = [x ** 2 for x in [1, 3, 5, 7]] # comprehension
my_list = list() # constructor
my_list = list(iterable) # construct list from any iterable| |Add|my_list.append(5)
my_list.append(list2) # my_list has list2 as the last item| |Remove|my_list.remove('value') # inplace, no return value
last = my_list.pop() # return and inplace remove last item in the list
value = my_list.pop(index)
del list[index] # inplace, no return value| |Contains|if 'value' in my_list: # in operator| |Get|n = my_list[index]| |Set|my_list[index] = value| |Size|len(my_list) # len is built-in function| |Insert|my_list.insert(index, value)| |Extend|my_list.extend(list2) # add all items in list2, not list2 as an item
my_list += [5, 4, 3] # extends the list with items in the other list
# don’t confuse append with extend| |Remove all|my_list.clear()
my_list = []
del my_list[:]| |indexOf|my_list.index('value')
my_list.index('value', startIndex)
my_list.index('value', startIndex, endIndex)| |Sort|my_list.sort() # inplace sorting
my_list = sorted(my_list) # reassignment| |Reverse|rev_list = my_list.reverse()
rev_list = my_list[::-1]
rev_list = list(reversed(my_list)) # reversed returns an iterator
sorted_rev_list = sorted(my_list, reverse=True)| |Copy|cloned_list = list.copy() # recall reference semantics|

Tuple

|Operation|API| |———|—| |Create|t = tuple()
t = (1, ) # need the comma to differentiate from an integer
t = (1, 2) # constructor
t = tuple(iterable) # construct tuple from any iterable| |Add|t = t + (3, ) # tuples are immutable!
t += (3, ) # same as above with shorthand operator
t = (*t, 3) # same as above, but uses unpacking| |Remove|# cannot remove since tuples are immutable
t = t[1:] # use slicing to create new tuple| |Contains|if 'value' in t: # in operator| |Get|n = t[index]| |Set|NA # cannot set since tuples are immutable| |Size|len(t) # len is built-in function| |Insert|# cannot insert since tuples are immutable
# we can concatenate with the + operator
t = t[index] + (3, ) + t[index:]| |Extend|# + operator will concatenate which is extend
t += t2 # concatenate add all items in t2
t += (*t2, ) # same as above but using unpacking| |Remove all|t = tuple() # construct an empty tuple| |indexOf|t.index('value')
t.index('value', startIndex)
t.index('value', startIndex, endIndex)| |Sort|t = tuple(sorted(t)) # sorted returns a list, recreate tuple| |Reverse|rev_t = t[::-1] # fastest
rev_t = tuple(reversed(t)) # reversed returns an iterator
sorted_rev_t = tuple(sorted(t, reverse=True))| |Copy|cloned_t = tuple(t) # recall reference semantics
cloned_t = (*t, ) # copy via unpacking|

Set

|Operation|API| |———|—| |Create|my_set = set() # constructor
my_set = set(iteratable) # create set from any iterable
my_set = { x**2 for x in range(11) } # comprehension
# Note: empty { } creates a dictionary not a set| |Add|my_set.add(5)
my_set.update({1, 2, 3}) # inplace union of the sets| |Remove|my_set.remove('value') # raise error if not found
my_set.discard('value') # no error raised if not found
my_set.pop() # remove a RANDOM item from the set
my_set.difference_update(set2) # inplace removes set2 items
diff_set = my_set - remove_set # difference operator| |Contains|if value in my_set: # in operator| |Size|len(my_set) # len is built-in function| |Remove All|my_set.clear()
my_set = set()| |Union|my_set = set1.union(set2) # union does not change the set
my_set = s1 \| s2 # same as above| |Intersection|my_set = s1.intersection(s2) # does not change the set
my_set = s1 & s2 # same as above| |Difference|my_set = s1.difference(s2) # difference does not change the set
my_set = s1 - s2 # same as above| |Copy|clone_set = my_set.copy() # recall reference semantics| |Get|NA Can only determine if item is in set or not| |Set|NA Cannot set the value of a specific element| |Insert|NA Just add the object to the set. There is no order of elements.| |indexOf
Sort
Reverse|NA There is no order in a set|

Dictionary

|Operation|API| |———|—| |Create|d = dict()
d = { } # empty dictionary
d = {k1:v1} # initialize a set with 1 key/value pair| |Add|d[key] = value # adds or sets the value
d.update(dict2) # inplace addition of all items in dict2
d = { **d1, **d2 } # creates with all unpacked items of d1 & d2| |Remove|last = d.popitem() # return & remove the last item inserted
item = d.pop(key) # return value & remove item at key
del d[key] # remove item at key, returns None| |Contains|if key in d: # in operator. Finds key only| |Get|value = d[key] # raises error if no key
value = d.get(key, def_value) # avoids error if not found| |Set|d[key] = value # adds or sets the value
d.setdefault(key, def_value) # sets only if key not in d. returns d[key]| |Size|len(d) # len is built-in function| |Insert|NA # dictionary order cannot change| |Extend|d.update(dict2) # inplace addition of all items in dict2| |Remove All|d.clear()
d = dict()| |indexOf|# No easy way. Must iterate through values
key = [k for k, v in d.items() if v == target][0] # error if not present| |Sort| # python retains original order of dictionary. recreate dictionary
sorted_d = { key:d[key] for key in sorted(d.keys()) }| |Reverse|rev_dict = { k:d[k] for k in reversed(d.keys())}| |Copy|clone_dict = d.copy()| |Misc|my_dict.keys()
my_dict.values()
my_dict.items()|

Simple Comprehensions

# list comprehension
my_list = [ n for n in range(100) ]

# set comprehension
my_set = { n for n in range(100) }

# dictionary comprehensions & construction
my_dict = { key: value for key, value in zip(range(10), range(10, 20)) } 
my_dict = dict( zip([k for k in range(10)], [v for v in range(10,20)]))
values = [ 6, 4, 2, 1, 3, 5]
my_dict = { key: values[key] for key in range(len(values)) }
my_dict = { key: value for key, value in enumerate(values) }

# There is NO tuple comprehension