"""
Good built in data structures is among the most important things in a good language.
Python has several.
"""

# The list
a = list()
a = []
a = [1, 3, 4, 5 ,6]

# They act like expected
for item in a:
    print(item)
print("\n\n")

# They can contain different types
b = [1, "Hello", a, 3.14, lambda a : a + 1]

for item in b:
    print(item)

# And be mutated
a.append(8)
a.extend(["Hello", "World"])
a[1] = 100

print(a)

print(a[:5])

print("\n\n\n")

# They are objects and can be inherited as such
print(dir(a))

class MyList(list):
    def __repr__(self):
        return "This is a useless representation"
    #pass

b = MyList(a)
print(b)


# The dictionary
# A mutable fast type agnostic hashed map
a = dict()
a = {}
a = {2: "Hello world", 3: b, 8: 6.12345}
# Note that all keys must be hashable
# a[["Not working"]] = 3
a[3] = ["This might work", "I think"]
print(a)

# They can be mutated
a[2] = 5
del a[3]

print(a)

# The keys and values can be easily red
print(a.keys())
print(a.values())


# The set

# They act like keys in dictionaries, assuming this makes using them easy
a = set()
a = {'apple', 'orange', 'apple', 'banana', 3, 3, 3, 3, 3}
print(a)

# Lists and set can be made from each other
a = [1, 2, 3, 2, 1, 2, 3, 2, 1]
b = set(a)
c = list(b)
print(a)
print(b)
print(c)