In [ ]:
from __future__ import absolute_import, division, print_function

Learn the standard library to at least know what's there

itertools and collections have very useful features

  • chain
  • product
  • permutations
  • combinations
  • izip

In [ ]:
%matplotlib inline
%config InlineBackend.figure_format='retina'

import matplotlib.pyplot as plt
import seaborn as sns
sns.set_context('talk')
sns.set_style('darkgrid') 
plt.rcParams['figure.figsize'] = 12, 8  # plotsize 

import numpy as np
import pandas as pd

In [ ]:
# plot residuals

In [ ]:
from itertools import groupby # NOT REGULAR GROUPBY
from itertools import product, cycle, izip
import re # regular expressions

Challenge (Easy)

Write a function to return the total number of digits in a given string, and those digits.


In [ ]:
test_string = """de3456yghj87654edfghuio908ujhgyuY^YHJUi8ytgh gtyujnh y7"""

In [ ]:
count = 0
digits = []
for x in test_string:
    try: 
        int(x)
        count += 1
        digits.append(int(x))
    except:
        pass
    
print("Number of digits:", str(count) + ";")
print("They are:", digits)

Challenge (Tricky)

Same as above -- but were consecutive digits are available, return as a single number.

Ex. "2a78b123" returns "3 numbers, they are: 2, 78, 123"


In [ ]:
test_string

In [ ]:
groups = []
uniquekeys = []
for k, g in groupby(test_string, lambda x: x.isdigit()):
    groups.append(list(g))
    uniquekeys.append(k)

In [ ]:
print(groups)
print(uniquekeys)

In [ ]:
numbers = []
for x, y in izip(groups, uniquekeys):
    if y:
        numbers.append(int(''.join([j for j in x])))
print("Number:", np.sum(uniquekeys))
print("They are:", numbers)

In [ ]:
# In one cell

def solution_2(test_string):
    groups = []
    uniquekeys = []
    for k, g in groupby(test_string, lambda x: x.isdigit()):
        if k:
            groups.append(int(''.join([j for j in g])))

    return len(groups), groups
    
print(solution_2(test_string))

Challenge (Tricky)

Same as above, but do it a second way.


In [ ]:
def solution_3(test_string):
    """Regular expressions can be a very powerful and useful tool."""
    groups = [int(j) for j in re.findall(r'\d+', test_string)]
    return len(groups), groups

solution_3(test_string)

Challenge (Hard)

Same as above, but all valid numbers expressed in digits, commas, and decimal points.

Ex. "a23.42dx9,331nm87,55" -> 4; 23.42, 9331, 87, 55

Left as an exercise :)

Don't spend much time on this one.

Generators


In [ ]:
def ex1(num):
    """A stupid example generator to prove a point."""
    while num > 1:
        num += 1
        yield num

In [ ]:
hey = ex1(5)

In [ ]:
hey.next()

In [ ]:
hey.next()

Gotchas

Modifying a dictionary's keys while iterating over it.

for key in dictionary:
    if key == "bat":
        del dictionary[key]

If you have to do someeven_better_name like this:

list_of_keys = dictionary.keys()
for key in list_of_keys:
    if key == "bat":
        del dictionary[key]

In [ ]:
even_better_name = 5

In [ ]:
even_better_name = 5

In [ ]:
even_better_name = 5

In [ ]:
even_better_name = 5

In [ ]:
even_better_name = 5

In [ ]:
even_better_name = 5

In [ ]: