Danger

DANGER WILL ROBINSON! This chapter is still UNDER CONSTRUCTION.

It is DEFINITELY full of mistakes and may be completely different when I am done editing it though most of the code should work

data structures: List Comprehensions: tests and solutions

tests

the code in tests/test_list_comprehensions.py from lists: list comprehensions

import random
import src.list_comprehensions
import unittest


def process(number):
    return number ** 2


def condition(number):
    return number % 2 == 0


class TestListComprehensions(unittest.TestCase):

    def setUp(self):
        self.iterable = range(0, random.randint(2, 1000))

    def test_make_a_list_w_a_for_loop(self):
        a_list = []
        for item in self.iterable:
            a_list.append(item)

        self.assertEqual(a_list, list(self.iterable))
        self.assertEqual(
            src.list_comprehensions.for_loop(self.iterable),
            list(self.iterable)
        )

    def test_make_a_list_w_a_list_comprehension(self):
        self.assertEqual(
            src.list_comprehensions.for_loop(self.iterable),
            [item for item in self.iterable]
        )
        self.assertEqual(
            src.list_comprehensions.list_comprehension(self.iterable),
            [item for item in self.iterable]
        )

    def test_list_comprehensions_w_conditions(self):
        even_numbers, odd_numbers = [], []
        for item in self.iterable:
            if condition(item):
                even_numbers.append(item)
            else:
                odd_numbers.append(item)

        self.assertEqual(
            even_numbers,
            [item for item in self.iterable if condition(item)]
        )
        self.assertEqual(
            src.list_comprehensions.get_even_numbers(self.iterable),
            [item for item in self.iterable if condition(item)]
        )
        self.assertEqual(
            odd_numbers,
            [item for item in self.iterable if not condition(item)]
        )
        self.assertEqual(
            src.list_comprehensions.get_odd_numbers(self.iterable),
            [item for item in self.iterable if not condition(item)]
        )

    def test_list_comprehensions_w_functions(self):
        square_numbers = []
        for item in self.iterable:
            square_numbers.append(process(item))

        self.assertEqual(
            square_numbers,
            [process(item) for item in self.iterable]
        )
        self.assertEqual(
            src.list_comprehensions.square(self.iterable),
            [process(item) for item in self.iterable]
        )

    def test_list_comprehensions_w_functions_and_conditions(self):
        even_squares, odd_squares = [], []
        for item in self.iterable:
            if condition(item):
                even_squares.append(process(item))
            else:
                odd_squares.append(process(item))

        self.assertEqual(
            even_squares,
            [process(item) for item in self.iterable if condition(item)]
        )
        self.assertEqual(
            odd_squares,
            [process(item) for item in self.iterable if not condition(item)]
        )


# Exceptions Encountered
# AssertionError
# NameError
# AttributeError

solutions

the solutions in list_comprehensions.py from lists: list comprehensions

def for_loop(iterable):
    result = []
    for item in iterable:
        result.append(item)
    return result


def list_comprehension(iterable):
    return [item for item in iterable]


def is_even(number):
    return number % 2 == 0


def get_even_numbers(iterable):
    return [item for item in iterable if is_even(item)]


def get_odd_numbers(iterable):
    return [item for item in iterable if not is_even(item)]


def square(iterable):
    return [item**2 for item in iterable]