# ================================
# Chapter 7 – Lists & Tuples Demo
# ================================
print("===== BASIC LIST CREATION =====")
# List literals
L1 = [1, 2, 3]
L2 = ["a", "b", "c"]
L3 = [1, "bill", 1.2345, True] # mixed types allowed
# Using the list() constructor from an iterable
L_from_str = list("spam") # ['s','p','a','m']
print("L1:", L1)
print("L2:", L2)
print("L3:", L3)
print("L_from_str:", L_from_str)
print()
print("===== LIST OPERATIONS (+, *, in, comparison) =====")
L4 = [1, 2, 3] + [4]
L5 = [1, 2, 3] * 2
print("[1,2,3] + [4] ->", L4)
print("[1,2,3] * 2 ->", L5)
print("1 in [1,2,3] ->", 1 in [1, 2, 3])
print("[1,2,3] < [1,2,4] ->", [1, 2, 3] < [1, 2, 4]) # lexicographic comparison
print()
print("===== INDEXING & LIST OF LISTS =====")
L_nested = ['a', [1, 2, 3], 'z']
print("L_nested:", L_nested)
print("L_nested[0] ->", L_nested[0])
print("L_nested[1] ->", L_nested[1]) # inner list
print("L_nested[1][0] ->", L_nested[1][0]) # nested index
print()
print("===== BUILT-IN FUNCTIONS: len, min, max, sum =====")
L_nums = [4, 7, 1, 2]
print("L_nums:", L_nums)
print("len(L_nums) ->", len(L_nums))
print("min(L_nums) ->", min(L_nums))
print("max(L_nums) ->", max(L_nums))
print("sum(L_nums) ->", sum(L_nums))
print()
print("===== ITERATION OVER LIST =====")
for x in L_nums:
print("Element:", x)
print()
print("===== MUTABILITY: STR vs LIST =====")
my_str = "abc"
try:
# This will raise an error (strings are immutable)
# my_str[0] = 'z'
print("Trying my_str[0] = 'z' would cause an error (immutable).")
except TypeError as e:
print("Error:", e)
my_list = [1, 2, 3]
print("Original my_list:", my_list)
my_list[0] = 127 # lists are mutable
print("After my_list[0] = 127:", my_list)
print()
print("===== COMMON LIST METHODS =====")
my_list = ['a', 1, True]
print("Start:", my_list)
# append
my_list.append('z')
print("After append('z'):", my_list)
# extend
my_list.extend([10, 20])
print("After extend([10,20]):", my_list)
# insert
my_list.insert(1, "INSERTED")
print("After insert(1,'INSERTED'):", my_list)
# remove
my_list.remove('a')
print("After remove('a'):", my_list)
# pop
popped = my_list.pop() # pops last
print("After pop() -> popped:", popped, ", list:", my_list)
# reverse
my_list.reverse()
print("After reverse():", my_list)
# sort (with numeric example)
nums = [4, 7, 1, 2]
print("\nnums before sort:", nums)
ret = nums.sort() # in-place, returns None
print("nums after sort():", nums)
print("Return value of nums.sort() ->", ret)
print()
print("===== RANGE AND LIST =====")
# In Python 3, range is a range object, but list(range(...)) gives a list
my_range_list = list(range(1, 5)) # [1,2,3,4]
print("list(range(1,5)) ->", my_range_list)
print()
print("===== STRING SPLIT RETURNS A LIST =====")
s = "this is a test"
split_list = s.split() # split on whitespace
print("'this is a test'.split() ->", split_list)
print()
print("===== SORTING: list.sort() vs sorted() =====")
lst = list("xyzabc")
print("lst original:", lst)
# in-place sort
lst.sort()
print("After lst.sort():", lst)
# sorted() returns new list
s2 = "hi mom"
sorted_chars = sorted(s2)
print("sorted('hi mom') ->", sorted_chars)
print()
print("===== REVERSE WORDS USING split + reverse + join =====")
sentence = "hello world from python"
words = sentence.split() # list of words
words.reverse() # reverse list in-place
rev_sentence = " ".join(words) # join with spaces
print("Original sentence:", sentence)
print("Reversed words:", rev_sentence)
print()
print("===== MUTABILITY & SHARED REFERENCES =====")
original = [1, 2, 3]
alias = original # both name the same list
alias[0] = 999
print("original after alias[0]=999 ->", original)
print("\n===== SHALLOW COPY WITH [:] =====")
L = [1, 2, [3, 4]]
shallow = L[:] # top-level copy (shallow)
shallow[0] = 100 # affects only shallow
print("L:", L)
print("shallow:", shallow)
# But inner list is shared:
shallow[2][0] = 300
print("\nAfter shallow[2][0] = 300")
print("L:", L) # L also changed in nested list
print("shallow:", shallow)
print("Note: inner list is shared (shallow copy).")
print()
print("===== TUPLES (IMMUTABLE LISTS) =====")
T = (1, 2, 3)
print("T:", T)
print("T[0] ->", T[0])
# one-element tuple syntax
t1 = (1,) # tuple
t2 = (1) # just integer
t3 = 1, # tuple
print("t1 (1,) ->", t1, "type:", type(t1))
print("t2 (1) ->", t2, "type:", type(t2))
print("t3 1, ->", t3, "type:", type(t3))
print("\nTuple indexing, slicing, len work like lists:")
print("T[1:] ->", T[1:])
print("len(T) ->", len(T))
print("\nBut methods that modify lists are not allowed on tuples:")
print("No T.append, T.extend, T.sort, etc. (would raise AttributeError).")
print()
print("===== LIST COMPREHENSIONS – BASIC =====")
# Basic: copy 1..4
comp1 = [n for n in range(1, 5)]
print("[n for n in range(1,5)] ->", comp1)
# Modify collected values: squares 1..5
comp2 = [n**2 for n in range(1, 6)]
print("[n**2 for n in range(1,6)] ->", comp2)
print("\n===== LIST COMPREHENSIONS – NESTED LOOPS =====")
comp3 = [x + y for x in range(1, 4) for y in range(1, 4)]
print("[x+y for x in range(1,4) for y in range(1,4)] ->", comp3)
print("\n===== LIST COMPREHENSIONS – WITH CONDITION =====")
comp4 = [c for c in "Hi There Mom" if c.isupper()]
print("[c for c in 'Hi There Mom' if c.isupper()] ->", comp4)
print()
print("===== SIMPLE ANAGRAM CHECK USING SORTED LISTS =====")
def are_anagrams(w1, w2):
return sorted(w1) == sorted(w2)
print("are_anagrams('iceman', 'cinema') ->", are_anagrams("iceman", "cinema"))
print("are_anagrams('hello', 'world') ->", are_anagrams("hello", "world"))
print()
print("===== END OF CHAPTER 7 DEMO =====")
IyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIENoYXB0ZXIgNyDigJMgTGlzdHMgJiBUdXBsZXMgRGVtbwojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpwcmludCgiPT09PT0gQkFTSUMgTElTVCBDUkVBVElPTiA9PT09PSIpCiMgTGlzdCBsaXRlcmFscwpMMSA9IFsxLCAyLCAzXQpMMiA9IFsiYSIsICJiIiwgImMiXQpMMyA9IFsxLCAiYmlsbCIsIDEuMjM0NSwgVHJ1ZV0gICAjIG1peGVkIHR5cGVzIGFsbG93ZWQKCiMgVXNpbmcgdGhlIGxpc3QoKSBjb25zdHJ1Y3RvciBmcm9tIGFuIGl0ZXJhYmxlCkxfZnJvbV9zdHIgPSBsaXN0KCJzcGFtIikgICAgICAgICMgWydzJywncCcsJ2EnLCdtJ10KcHJpbnQoIkwxOiIsIEwxKQpwcmludCgiTDI6IiwgTDIpCnByaW50KCJMMzoiLCBMMykKcHJpbnQoIkxfZnJvbV9zdHI6IiwgTF9mcm9tX3N0cikKcHJpbnQoKQoKcHJpbnQoIj09PT09IExJU1QgT1BFUkFUSU9OUyAoKywgKiwgaW4sIGNvbXBhcmlzb24pID09PT09IikKTDQgPSBbMSwgMiwgM10gKyBbNF0KTDUgPSBbMSwgMiwgM10gKiAyCnByaW50KCJbMSwyLDNdICsgWzRdIC0+IiwgTDQpCnByaW50KCJbMSwyLDNdICogMiAgLT4iLCBMNSkKcHJpbnQoIjEgaW4gWzEsMiwzXSAtPiIsIDEgaW4gWzEsIDIsIDNdKQpwcmludCgiWzEsMiwzXSA8IFsxLDIsNF0gLT4iLCBbMSwgMiwgM10gPCBbMSwgMiwgNF0pICAjIGxleGljb2dyYXBoaWMgY29tcGFyaXNvbgpwcmludCgpCgpwcmludCgiPT09PT0gSU5ERVhJTkcgJiBMSVNUIE9GIExJU1RTID09PT09IikKTF9uZXN0ZWQgPSBbJ2EnLCBbMSwgMiwgM10sICd6J10KcHJpbnQoIkxfbmVzdGVkOiIsIExfbmVzdGVkKQpwcmludCgiTF9uZXN0ZWRbMF0gLT4iLCBMX25lc3RlZFswXSkKcHJpbnQoIkxfbmVzdGVkWzFdIC0+IiwgTF9uZXN0ZWRbMV0pICAgICAgICMgaW5uZXIgbGlzdApwcmludCgiTF9uZXN0ZWRbMV1bMF0gLT4iLCBMX25lc3RlZFsxXVswXSkgIyBuZXN0ZWQgaW5kZXgKcHJpbnQoKQoKcHJpbnQoIj09PT09IEJVSUxULUlOIEZVTkNUSU9OUzogbGVuLCBtaW4sIG1heCwgc3VtID09PT09IikKTF9udW1zID0gWzQsIDcsIDEsIDJdCnByaW50KCJMX251bXM6IiwgTF9udW1zKQpwcmludCgibGVuKExfbnVtcykgLT4iLCBsZW4oTF9udW1zKSkKcHJpbnQoIm1pbihMX251bXMpIC0+IiwgbWluKExfbnVtcykpCnByaW50KCJtYXgoTF9udW1zKSAtPiIsIG1heChMX251bXMpKQpwcmludCgic3VtKExfbnVtcykgLT4iLCBzdW0oTF9udW1zKSkKcHJpbnQoKQoKcHJpbnQoIj09PT09IElURVJBVElPTiBPVkVSIExJU1QgPT09PT0iKQpmb3IgeCBpbiBMX251bXM6CiAgICBwcmludCgiRWxlbWVudDoiLCB4KQpwcmludCgpCgpwcmludCgiPT09PT0gTVVUQUJJTElUWTogU1RSIHZzIExJU1QgPT09PT0iKQpteV9zdHIgPSAiYWJjIgp0cnk6CiAgICAjIFRoaXMgd2lsbCByYWlzZSBhbiBlcnJvciAoc3RyaW5ncyBhcmUgaW1tdXRhYmxlKQogICAgIyBteV9zdHJbMF0gPSAneicKICAgIHByaW50KCJUcnlpbmcgbXlfc3RyWzBdID0gJ3onIHdvdWxkIGNhdXNlIGFuIGVycm9yIChpbW11dGFibGUpLiIpCmV4Y2VwdCBUeXBlRXJyb3IgYXMgZToKICAgIHByaW50KCJFcnJvcjoiLCBlKQoKbXlfbGlzdCA9IFsxLCAyLCAzXQpwcmludCgiT3JpZ2luYWwgbXlfbGlzdDoiLCBteV9saXN0KQpteV9saXN0WzBdID0gMTI3ICAgICMgbGlzdHMgYXJlIG11dGFibGUKcHJpbnQoIkFmdGVyIG15X2xpc3RbMF0gPSAxMjc6IiwgbXlfbGlzdCkKcHJpbnQoKQoKcHJpbnQoIj09PT09IENPTU1PTiBMSVNUIE1FVEhPRFMgPT09PT0iKQpteV9saXN0ID0gWydhJywgMSwgVHJ1ZV0KcHJpbnQoIlN0YXJ0OiIsIG15X2xpc3QpCgojIGFwcGVuZApteV9saXN0LmFwcGVuZCgneicpCnByaW50KCJBZnRlciBhcHBlbmQoJ3onKToiLCBteV9saXN0KQoKIyBleHRlbmQKbXlfbGlzdC5leHRlbmQoWzEwLCAyMF0pCnByaW50KCJBZnRlciBleHRlbmQoWzEwLDIwXSk6IiwgbXlfbGlzdCkKCiMgaW5zZXJ0Cm15X2xpc3QuaW5zZXJ0KDEsICJJTlNFUlRFRCIpCnByaW50KCJBZnRlciBpbnNlcnQoMSwnSU5TRVJURUQnKToiLCBteV9saXN0KQoKIyByZW1vdmUKbXlfbGlzdC5yZW1vdmUoJ2EnKQpwcmludCgiQWZ0ZXIgcmVtb3ZlKCdhJyk6IiwgbXlfbGlzdCkKCiMgcG9wCnBvcHBlZCA9IG15X2xpc3QucG9wKCkgICMgcG9wcyBsYXN0CnByaW50KCJBZnRlciBwb3AoKSAtPiBwb3BwZWQ6IiwgcG9wcGVkLCAiLCBsaXN0OiIsIG15X2xpc3QpCgojIHJldmVyc2UKbXlfbGlzdC5yZXZlcnNlKCkKcHJpbnQoIkFmdGVyIHJldmVyc2UoKToiLCBteV9saXN0KQoKIyBzb3J0ICh3aXRoIG51bWVyaWMgZXhhbXBsZSkKbnVtcyA9IFs0LCA3LCAxLCAyXQpwcmludCgiXG5udW1zIGJlZm9yZSBzb3J0OiIsIG51bXMpCnJldCA9IG51bXMuc29ydCgpICAgICAgICMgaW4tcGxhY2UsIHJldHVybnMgTm9uZQpwcmludCgibnVtcyBhZnRlciBzb3J0KCk6IiwgbnVtcykKcHJpbnQoIlJldHVybiB2YWx1ZSBvZiBudW1zLnNvcnQoKSAtPiIsIHJldCkKcHJpbnQoKQoKcHJpbnQoIj09PT09IFJBTkdFIEFORCBMSVNUID09PT09IikKIyBJbiBQeXRob24gMywgcmFuZ2UgaXMgYSByYW5nZSBvYmplY3QsIGJ1dCBsaXN0KHJhbmdlKC4uLikpIGdpdmVzIGEgbGlzdApteV9yYW5nZV9saXN0ID0gbGlzdChyYW5nZSgxLCA1KSkgICAjIFsxLDIsMyw0XQpwcmludCgibGlzdChyYW5nZSgxLDUpKSAtPiIsIG15X3JhbmdlX2xpc3QpCnByaW50KCkKCnByaW50KCI9PT09PSBTVFJJTkcgU1BMSVQgUkVUVVJOUyBBIExJU1QgPT09PT0iKQpzID0gInRoaXMgaXMgYSB0ZXN0IgpzcGxpdF9saXN0ID0gcy5zcGxpdCgpICAjIHNwbGl0IG9uIHdoaXRlc3BhY2UKcHJpbnQoIid0aGlzIGlzIGEgdGVzdCcuc3BsaXQoKSAtPiIsIHNwbGl0X2xpc3QpCnByaW50KCkKCnByaW50KCI9PT09PSBTT1JUSU5HOiBsaXN0LnNvcnQoKSB2cyBzb3J0ZWQoKSA9PT09PSIpCmxzdCA9IGxpc3QoInh5emFiYyIpCnByaW50KCJsc3Qgb3JpZ2luYWw6IiwgbHN0KQoKIyBpbi1wbGFjZSBzb3J0CmxzdC5zb3J0KCkKcHJpbnQoIkFmdGVyIGxzdC5zb3J0KCk6IiwgbHN0KQoKIyBzb3J0ZWQoKSByZXR1cm5zIG5ldyBsaXN0CnMyID0gImhpIG1vbSIKc29ydGVkX2NoYXJzID0gc29ydGVkKHMyKQpwcmludCgic29ydGVkKCdoaSBtb20nKSAtPiIsIHNvcnRlZF9jaGFycykKcHJpbnQoKQoKcHJpbnQoIj09PT09IFJFVkVSU0UgV09SRFMgVVNJTkcgc3BsaXQgKyByZXZlcnNlICsgam9pbiA9PT09PSIpCnNlbnRlbmNlID0gImhlbGxvIHdvcmxkIGZyb20gcHl0aG9uIgp3b3JkcyA9IHNlbnRlbmNlLnNwbGl0KCkgICAgICAgICAgIyBsaXN0IG9mIHdvcmRzCndvcmRzLnJldmVyc2UoKSAgICAgICAgICAgICAgICAgICAjIHJldmVyc2UgbGlzdCBpbi1wbGFjZQpyZXZfc2VudGVuY2UgPSAiICIuam9pbih3b3JkcykgICAgIyBqb2luIHdpdGggc3BhY2VzCnByaW50KCJPcmlnaW5hbCBzZW50ZW5jZToiLCBzZW50ZW5jZSkKcHJpbnQoIlJldmVyc2VkIHdvcmRzOiIsIHJldl9zZW50ZW5jZSkKcHJpbnQoKQoKcHJpbnQoIj09PT09IE1VVEFCSUxJVFkgJiBTSEFSRUQgUkVGRVJFTkNFUyA9PT09PSIpCm9yaWdpbmFsID0gWzEsIDIsIDNdCmFsaWFzID0gb3JpZ2luYWwgICAgICAgIyBib3RoIG5hbWUgdGhlIHNhbWUgbGlzdAphbGlhc1swXSA9IDk5OQpwcmludCgib3JpZ2luYWwgYWZ0ZXIgYWxpYXNbMF09OTk5IC0+Iiwgb3JpZ2luYWwpCgpwcmludCgiXG49PT09PSBTSEFMTE9XIENPUFkgV0lUSCBbOl0gPT09PT0iKQpMID0gWzEsIDIsIFszLCA0XV0Kc2hhbGxvdyA9IExbOl0gICAgICAgICAjIHRvcC1sZXZlbCBjb3B5IChzaGFsbG93KQpzaGFsbG93WzBdID0gMTAwICAgICAgICMgYWZmZWN0cyBvbmx5IHNoYWxsb3cKcHJpbnQoIkw6IiwgTCkKcHJpbnQoInNoYWxsb3c6Iiwgc2hhbGxvdykKCiMgQnV0IGlubmVyIGxpc3QgaXMgc2hhcmVkOgpzaGFsbG93WzJdWzBdID0gMzAwCnByaW50KCJcbkFmdGVyIHNoYWxsb3dbMl1bMF0gPSAzMDAiKQpwcmludCgiTDoiLCBMKSAgICAgICAgICMgTCBhbHNvIGNoYW5nZWQgaW4gbmVzdGVkIGxpc3QKcHJpbnQoInNoYWxsb3c6Iiwgc2hhbGxvdykKcHJpbnQoIk5vdGU6IGlubmVyIGxpc3QgaXMgc2hhcmVkIChzaGFsbG93IGNvcHkpLiIpCnByaW50KCkKCnByaW50KCI9PT09PSBUVVBMRVMgKElNTVVUQUJMRSBMSVNUUykgPT09PT0iKQpUID0gKDEsIDIsIDMpCnByaW50KCJUOiIsIFQpCnByaW50KCJUWzBdIC0+IiwgVFswXSkKCiMgb25lLWVsZW1lbnQgdHVwbGUgc3ludGF4CnQxID0gKDEsKSAgICAjIHR1cGxlCnQyID0gKDEpICAgICAjIGp1c3QgaW50ZWdlcgp0MyA9IDEsICAgICAgIyB0dXBsZQpwcmludCgidDEgKDEsKSAtPiIsIHQxLCAidHlwZToiLCB0eXBlKHQxKSkKcHJpbnQoInQyICgxKSAgLT4iLCB0MiwgInR5cGU6IiwgdHlwZSh0MikpCnByaW50KCJ0MyAxLCAgIC0+IiwgdDMsICJ0eXBlOiIsIHR5cGUodDMpKQoKcHJpbnQoIlxuVHVwbGUgaW5kZXhpbmcsIHNsaWNpbmcsIGxlbiB3b3JrIGxpa2UgbGlzdHM6IikKcHJpbnQoIlRbMTpdIC0+IiwgVFsxOl0pCnByaW50KCJsZW4oVCkgLT4iLCBsZW4oVCkpCgpwcmludCgiXG5CdXQgbWV0aG9kcyB0aGF0IG1vZGlmeSBsaXN0cyBhcmUgbm90IGFsbG93ZWQgb24gdHVwbGVzOiIpCnByaW50KCJObyBULmFwcGVuZCwgVC5leHRlbmQsIFQuc29ydCwgZXRjLiAod291bGQgcmFpc2UgQXR0cmlidXRlRXJyb3IpLiIpCnByaW50KCkKCnByaW50KCI9PT09PSBMSVNUIENPTVBSRUhFTlNJT05TIOKAkyBCQVNJQyA9PT09PSIpCiMgQmFzaWM6IGNvcHkgMS4uNApjb21wMSA9IFtuIGZvciBuIGluIHJhbmdlKDEsIDUpXQpwcmludCgiW24gZm9yIG4gaW4gcmFuZ2UoMSw1KV0gLT4iLCBjb21wMSkKCiMgTW9kaWZ5IGNvbGxlY3RlZCB2YWx1ZXM6IHNxdWFyZXMgMS4uNQpjb21wMiA9IFtuKioyIGZvciBuIGluIHJhbmdlKDEsIDYpXQpwcmludCgiW24qKjIgZm9yIG4gaW4gcmFuZ2UoMSw2KV0gLT4iLCBjb21wMikKCnByaW50KCJcbj09PT09IExJU1QgQ09NUFJFSEVOU0lPTlMg4oCTIE5FU1RFRCBMT09QUyA9PT09PSIpCmNvbXAzID0gW3ggKyB5IGZvciB4IGluIHJhbmdlKDEsIDQpIGZvciB5IGluIHJhbmdlKDEsIDQpXQpwcmludCgiW3greSBmb3IgeCBpbiByYW5nZSgxLDQpIGZvciB5IGluIHJhbmdlKDEsNCldIC0+IiwgY29tcDMpCgpwcmludCgiXG49PT09PSBMSVNUIENPTVBSRUhFTlNJT05TIOKAkyBXSVRIIENPTkRJVElPTiA9PT09PSIpCmNvbXA0ID0gW2MgZm9yIGMgaW4gIkhpIFRoZXJlIE1vbSIgaWYgYy5pc3VwcGVyKCldCnByaW50KCJbYyBmb3IgYyBpbiAnSGkgVGhlcmUgTW9tJyBpZiBjLmlzdXBwZXIoKV0gLT4iLCBjb21wNCkKcHJpbnQoKQoKcHJpbnQoIj09PT09IFNJTVBMRSBBTkFHUkFNIENIRUNLIFVTSU5HIFNPUlRFRCBMSVNUUyA9PT09PSIpCmRlZiBhcmVfYW5hZ3JhbXModzEsIHcyKToKICAgIHJldHVybiBzb3J0ZWQodzEpID09IHNvcnRlZCh3MikKCnByaW50KCJhcmVfYW5hZ3JhbXMoJ2ljZW1hbicsICdjaW5lbWEnKSAtPiIsIGFyZV9hbmFncmFtcygiaWNlbWFuIiwgImNpbmVtYSIpKQpwcmludCgiYXJlX2FuYWdyYW1zKCdoZWxsbycsICd3b3JsZCcpICAtPiIsIGFyZV9hbmFncmFtcygiaGVsbG8iLCAid29ybGQiKSkKcHJpbnQoKQoKcHJpbnQoIj09PT09IEVORCBPRiBDSEFQVEVSIDcgREVNTyA9PT09PSIpCg==
===== BASIC LIST CREATION =====
('L1:', [1, 2, 3])
('L2:', ['a', 'b', 'c'])
('L3:', [1, 'bill', 1.2345, True])
('L_from_str:', ['s', 'p', 'a', 'm'])
()
===== LIST OPERATIONS (+, *, in, comparison) =====
('[1,2,3] + [4] ->', [1, 2, 3, 4])
('[1,2,3] * 2 ->', [1, 2, 3, 1, 2, 3])
('1 in [1,2,3] ->', True)
('[1,2,3] < [1,2,4] ->', True)
()
===== INDEXING & LIST OF LISTS =====
('L_nested:', ['a', [1, 2, 3], 'z'])
('L_nested[0] ->', 'a')
('L_nested[1] ->', [1, 2, 3])
('L_nested[1][0] ->', 1)
()
===== BUILT-IN FUNCTIONS: len, min, max, sum =====
('L_nums:', [4, 7, 1, 2])
('len(L_nums) ->', 4)
('min(L_nums) ->', 1)
('max(L_nums) ->', 7)
('sum(L_nums) ->', 14)
()
===== ITERATION OVER LIST =====
('Element:', 4)
('Element:', 7)
('Element:', 1)
('Element:', 2)
()
===== MUTABILITY: STR vs LIST =====
Trying my_str[0] = 'z' would cause an error (immutable).
('Original my_list:', [1, 2, 3])
('After my_list[0] = 127:', [127, 2, 3])
()
===== COMMON LIST METHODS =====
('Start:', ['a', 1, True])
("After append('z'):", ['a', 1, True, 'z'])
('After extend([10,20]):', ['a', 1, True, 'z', 10, 20])
("After insert(1,'INSERTED'):", ['a', 'INSERTED', 1, True, 'z', 10, 20])
("After remove('a'):", ['INSERTED', 1, True, 'z', 10, 20])
('After pop() -> popped:', 20, ', list:', ['INSERTED', 1, True, 'z', 10])
('After reverse():', [10, 'z', True, 1, 'INSERTED'])
('\nnums before sort:', [4, 7, 1, 2])
('nums after sort():', [1, 2, 4, 7])
('Return value of nums.sort() ->', None)
()
===== RANGE AND LIST =====
('list(range(1,5)) ->', [1, 2, 3, 4])
()
===== STRING SPLIT RETURNS A LIST =====
("'this is a test'.split() ->", ['this', 'is', 'a', 'test'])
()
===== SORTING: list.sort() vs sorted() =====
('lst original:', ['x', 'y', 'z', 'a', 'b', 'c'])
('After lst.sort():', ['a', 'b', 'c', 'x', 'y', 'z'])
("sorted('hi mom') ->", [' ', 'h', 'i', 'm', 'm', 'o'])
()
===== REVERSE WORDS USING split + reverse + join =====
('Original sentence:', 'hello world from python')
('Reversed words:', 'python from world hello')
()
===== MUTABILITY & SHARED REFERENCES =====
('original after alias[0]=999 ->', [999, 2, 3])
===== SHALLOW COPY WITH [:] =====
('L:', [1, 2, [3, 4]])
('shallow:', [100, 2, [3, 4]])
After shallow[2][0] = 300
('L:', [1, 2, [300, 4]])
('shallow:', [100, 2, [300, 4]])
Note: inner list is shared (shallow copy).
()
===== TUPLES (IMMUTABLE LISTS) =====
('T:', (1, 2, 3))
('T[0] ->', 1)
('t1 (1,) ->', (1,), 'type:', <type 'tuple'>)
('t2 (1) ->', 1, 'type:', <type 'int'>)
('t3 1, ->', (1,), 'type:', <type 'tuple'>)
Tuple indexing, slicing, len work like lists:
('T[1:] ->', (2, 3))
('len(T) ->', 3)
But methods that modify lists are not allowed on tuples:
No T.append, T.extend, T.sort, etc. (would raise AttributeError).
()
===== LIST COMPREHENSIONS – BASIC =====
('[n for n in range(1,5)] ->', [1, 2, 3, 4])
('[n**2 for n in range(1,6)] ->', [1, 4, 9, 16, 25])
===== LIST COMPREHENSIONS – NESTED LOOPS =====
('[x+y for x in range(1,4) for y in range(1,4)] ->', [2, 3, 4, 3, 4, 5, 4, 5, 6])
===== LIST COMPREHENSIONS – WITH CONDITION =====
("[c for c in 'Hi There Mom' if c.isupper()] ->", ['H', 'T', 'M'])
()
===== SIMPLE ANAGRAM CHECK USING SORTED LISTS =====
("are_anagrams('iceman', 'cinema') ->", True)
("are_anagrams('hello', 'world') ->", False)
()
===== END OF CHAPTER 7 DEMO =====