# coding: utf-8
# # Algo Toolbox and "*Pythoneries*"
# ## Lists
# ### **Exercise: Split List**
# Write a function that split a list of length `n`, with n odd, into 3 parts:
# - the elements of the first half of the list (without the middle one)
# - the middle element
# - the elements of the second half of the list (without the middle one)
#
# In[ ]:
def splitlist(L):
#FIXME
# #### Pythonery
# This can be simplified with *Python list slices*:
# - L[a:b] is the sub list of L with elements from positions a to b (b excluded)
# - L[:a] is the list L[0:a]
# - L[a:] is the list L[b:len(n)]
# - L[-1] is L[len(L)]
# In[ ]:
def splitlist(L):
#FIXME
# In[ ]:
L = [1, 2, 3, 4, 5, 6, 7, 8, 9]
splitlist(L)
# ### **Exercise: Binary Search**
# Write two functions to search an element in a sorted (in increasing order) list:
# - `binarysearch(L, x, left, right)` returns the position where `x` is or might be in `L[left, right[`, with `L` sorted in increasing order.
#
# In[ ]:
def binarysearch(L, x, left, right):
"""Binary Search
Args:
L: List to search in
x: Value to search
left, right: Search intervalle in L [left, right[
Returns:
The position where x is or might be
"""
#FIXME
# In[ ]:
L = [-3, 0, 5, 8, 13, 24, 32, 37, 42]
# In[ ]:
binarysearch(L, 0, 0, len(L))
# - `listSearch(L, x)` returns `-1` if `x` in not in the list `L`, its position otherwise
# In[ ]:
def listsearch(L, x):
#FIXME
# #### Pythonery
# Use *Python "ternary" operator*:
# `[on_true] if [expression] else [on_false]`
# In[ ]:
def listsearch2(x, L):
#FIXME
# ### **Exercise: Build List → Build Matrix**
# Write the function `buildlist(nb, val = None, alea = None)` that builds a new list of length `nb`:
# - `buildlist(nb)` returns `[None, None, ...]`
# - `buildlist(nb, val)` returns `[val, val, ...]`
# - `buildlist(nb, alea = (a, b))` returns a list of `nb` random values in `[a, b[`
# Note: `if a:` is `False` when `a` is `0, None, [], "" ...`
# In[ ]:
# Reminder on imports, random and seed
import random
help(random.randint)
# In[ ]:
help(random.seed)
random.seed() # do it once only!
# In[ ]:
def buildlist(nb, val = None, alea = None):
#FIXME
# #### Pythonery
# *Python gives a short way to build list*: `[val] * nb`
# In[ ]:
def buildlist(nb, val = None, alea = None):
#FIXME
# Test the "short" version ([val] * n) with random numbers...
# In[ ]:
[random.randint(0, 10)] * 5
# #### Pythonery: "list comprehension"
# Test the following, then use it to write again `buildlist`

# In[ ]:
[i for i in range(10)]
# In[ ]:
def buildList(nb, val = None, alea = None):
#FIXME
# In[ ]:
buildlist(5), buildList(5, 0), buildList(5, alea = (0,10))
# #### WARNING:
# when you want to build a list of lists
# In[ ]:
L = buildList(9, [])
# In[ ]:
L
# In[ ]:
L[0].append(1)
# In[ ]:
L
# Write again `buildlist` to avoid the problem
# In[ ]:
def buildlist(nb, val = None, alea = None):
#FIXME
# Use `buildlist` to build a (5*5) matrix filled with None, then change a value
# In[ ]:
M = buildlist(4, buildlist(5, None))
# In[ ]:
M
# In[ ]:
M[0][0] = 5
# In[ ]:
M
# Write a function `buildmatrix(line, col, val = None)` that builds a `(line*col)` matrix filled with `val`.
# In[ ]:
def buildmatrix(line, col, val = None):
#FIXME
# In[ ]:
M = buildmatrix(4, 5)
M[0][0] = 3
M