Introduction
------------
- another data type in Python
- consists of `key: value` pair inside `{}`
- sequences are indexed via element number (fruit[0]) while dictionaries are
indexed via keys (telephone_number['John'])
- keys are immutable
- keys can be any of the following:
a. strings
b. numbers
c. tuples (if contains only immutable object)
- you cannot use lists as keys because they can be modified using append(),
insert(), etc..
- adding value on an existing key replaces the old value
- extracting a value from a non-existing key will result to `KeyError`
How to use dictionaries?
------------------------
Simple demo on how to use dictionaries | >>> tel = {'jack': 4098, 'sape': 4139} # creating a dictionary >>> tel['guido'] = 4127 # adds an entry >>> tel {'sape': 4139, 'guido': 4127, 'jack': 4098} >>> tel['jack'] 4098 >>> del tel['sape'] # deleting an entry >>> tel['irv'] = 4127 >>> tel {'guido': 4127, 'irv': 4127, 'jack': 4098} >>> list(tel.keys()) ['irv', 'guido', 'jack'] >>> sorted(tel.keys()) ['guido', 'irv', 'jack'] >>> 'guido' in tel True >>> 'jack' not in tel False |
Creating an empty dictionary and adding | >>> empty = {} >>> empty {} >>> >>> empty['first entry'] = 1 >>> empty {'first entry': 1} >>> |
Listing all keys of a dictionary | >>> tel.keys() dict_keys(['jack', 'sape']) >>> |
Sorting keys | >>> sorted(dict.keys()) |
You can use dic() constructor to build a | >>> dict([('sape', 4139), ('guido', 4127), ('jack', 4098)]) {'sape': 4139, 'jack': 4098, 'guido': 4127} >>> >>> dict(sape=4139, guido=4127, jack=4098) # alternative way, useful if keys are {'sape': 4139, 'jack': 4098, 'guido': 4127} # simple strings >>> |
Creating a dict comprehension | >>> {x: x**2 for x in (2, 4, 6)} {2: 4, 4: 16, 6: 36} >>> |
Other operations that can be done on | dict.clear() |
Operations on dictionaries
--------------------------
Getting keys values using get() | Format: dict.get(KEY, VALUE) Usage: - a non-existent key returns None - you may provide a value on non-existing keys
>>> dict.get('name') 'john' >>> dict.get('occupation') >>> print(dict.get('occupation')) None >>> print(dict.get('occupation', 'taxi driver')) taxi driver >>> |
Merging | # How to merge two dictionaries # in Python 3.5+
>>> x = {'a': 1, 'b': 2} >>> y = {'b': 3, 'c': 4} >>> z = {**x, **y} >>> z {'c': 4, 'a': 1, 'b': 3}
# In Python 2.x you could # use this: >>> z = dict(x, **y) >>> z {'a': 1, 'c': 4, 'b': 3}
# In these examples, Python merges dictionary keys # in the order listed in the expression, overwriting # duplicates from left to right. # |
Sorting | Use dict.items() to generate a list then feed that into lambda.
>>> d {'a': 500, 'b': 1000, 'c': 1} >>> >>> >>> sorted(d.items(), key=lambda x: x[1]) [('c', 1), ('a', 500), ('b', 1000)] >>> >>> sorted(d.items(), key=lambda x: x[0]) [('a', 500), ('b', 1000), ('c', 1)] >>> >>>
Or you may use `operator` module.
>>> import operator >>> sorted(d.items(), key=operator.itemgetter(1)) [('c', 1), ('a', 500), ('b', 1000)] >>> |
Ways of unpacking | Using a wrapper function: >>> d {'a': 1, 'b': 2, 'c': 3} >>> def unpack_me(x, y, z): ... print(x, y, z) ... >>> unpack_me(*d) a b c >>> |
Tutorials/Tips and Tricks
-------------------------
Emulating case statements | # Because Python has first-class functions they can # be used to emulate switch/case statements
def dispatch_if(operator, x, y): if operator == 'add': return x + y elif operator == 'sub': return x - y elif operator == 'mul': return x * y elif operator == 'div': return x / y else: return None
def dispatch_dict(operator, x, y): --> I don't get this!!! return { 'add': lambda: x + y, 'sub': lambda: x - y, 'mul': lambda: x * y, 'div': lambda: x / y, }.get(operator, lambda: None)()
>>> dispatch_if('mul', 2, 8) 16
>>> dispatch_dict('mul', 2, 8) 16
>>> dispatch_if('unknown', 2, 8) None
>>> dispatch_dict('unknown', 2, 8) None |
No comments:
Post a Comment