"""Lists
http://openbookproject.net/thinkcs/python/english2e/ch09.html
"""


# A list is an ordered set of values, where each value is identified by an index.
# The values that make up a list are called its elements.
# Lists are similar to strings, which are ordered sets of characters, except that
# the elements of a list can have any type.

# use the bracket notation to create a list:

vocabulary = ["ameliorate", "castigate", "defenestrate"]
numbers = [17, 123]
empty = []

# The elements of a list don't have to be the same type:
mixed_list = ["hello", 2.0, 5, [10, 20]]

# Elements of a list are accessed using the bracket operator, the same way the characters
# of a string.
# Remember that the indices start at 0:

numbers = [17, 123]
print numbers[0]

# the index can't be larger than the length of the list - 1:
print numbers[2]

# Any integer expression can be used as an index:

print numbers[9-8]

# but the expression needs to be an integer value:

print numbers[1.0]

# If an index has a negative value, it counts backward from the end of the list:

print numbers[-1]
print numbers[-2]

# now, what do you think about this one:
print numbers[-3]

# it is common to iterate through the elements of a list using a for loop:
# (note the useage of len() to obtain the length of a list)

words = ["ameliorate", "castigate", "defenestrate"]
for i in range(len(vocabulary)) :
    print words[i],len(words[i])

# or:

for word in words :
    print word, len(word)

# list membership is determined using the in operator:

vocabulary = ["ameliorate", "castigate", "defenestrate"]
'castigate' in vocabulary
'word' in vocabulary

# list operations

# the + operator concatenates lists:

a = [1, 2, 3]
b = [4, 5, 6]
c = a + b
print c

[0] * 4

# Slices
# The slice operations we saw with strings also work on lists:

a_list = ['a', 'b', 'c', 'd', 'e', 'f']
a_list[1:3]
a_list[:4]
a_list[3:]
a_list[:]

# Unlike strings, lists are mutable, which means we can change their elements
# using the bracket operator:

fruit = ["banana", "apple", "quince"]
fruit[0] = "pear"
fruit[-1] = "orange"

# del removes an element from a list:

a = ['one', 'two', 'three']
del a[1]
print a

# comment:  I don't recommend using the del operator - it's easy to make mistakes.