17db96d56Sopenharmony_ci.. _tut-structures: 27db96d56Sopenharmony_ci 37db96d56Sopenharmony_ci*************** 47db96d56Sopenharmony_ciData Structures 57db96d56Sopenharmony_ci*************** 67db96d56Sopenharmony_ci 77db96d56Sopenharmony_ciThis chapter describes some things you've learned about already in more detail, 87db96d56Sopenharmony_ciand adds some new things as well. 97db96d56Sopenharmony_ci 107db96d56Sopenharmony_ci.. _tut-morelists: 117db96d56Sopenharmony_ci 127db96d56Sopenharmony_ciMore on Lists 137db96d56Sopenharmony_ci============= 147db96d56Sopenharmony_ci 157db96d56Sopenharmony_ciThe list data type has some more methods. Here are all of the methods of list 167db96d56Sopenharmony_ciobjects: 177db96d56Sopenharmony_ci 187db96d56Sopenharmony_ci 197db96d56Sopenharmony_ci.. method:: list.append(x) 207db96d56Sopenharmony_ci :noindex: 217db96d56Sopenharmony_ci 227db96d56Sopenharmony_ci Add an item to the end of the list. Equivalent to ``a[len(a):] = [x]``. 237db96d56Sopenharmony_ci 247db96d56Sopenharmony_ci 257db96d56Sopenharmony_ci.. method:: list.extend(iterable) 267db96d56Sopenharmony_ci :noindex: 277db96d56Sopenharmony_ci 287db96d56Sopenharmony_ci Extend the list by appending all the items from the iterable. Equivalent to 297db96d56Sopenharmony_ci ``a[len(a):] = iterable``. 307db96d56Sopenharmony_ci 317db96d56Sopenharmony_ci 327db96d56Sopenharmony_ci.. method:: list.insert(i, x) 337db96d56Sopenharmony_ci :noindex: 347db96d56Sopenharmony_ci 357db96d56Sopenharmony_ci Insert an item at a given position. The first argument is the index of the 367db96d56Sopenharmony_ci element before which to insert, so ``a.insert(0, x)`` inserts at the front of 377db96d56Sopenharmony_ci the list, and ``a.insert(len(a), x)`` is equivalent to ``a.append(x)``. 387db96d56Sopenharmony_ci 397db96d56Sopenharmony_ci 407db96d56Sopenharmony_ci.. method:: list.remove(x) 417db96d56Sopenharmony_ci :noindex: 427db96d56Sopenharmony_ci 437db96d56Sopenharmony_ci Remove the first item from the list whose value is equal to *x*. It raises a 447db96d56Sopenharmony_ci :exc:`ValueError` if there is no such item. 457db96d56Sopenharmony_ci 467db96d56Sopenharmony_ci 477db96d56Sopenharmony_ci.. method:: list.pop([i]) 487db96d56Sopenharmony_ci :noindex: 497db96d56Sopenharmony_ci 507db96d56Sopenharmony_ci Remove the item at the given position in the list, and return it. If no index 517db96d56Sopenharmony_ci is specified, ``a.pop()`` removes and returns the last item in the list. (The 527db96d56Sopenharmony_ci square brackets around the *i* in the method signature denote that the parameter 537db96d56Sopenharmony_ci is optional, not that you should type square brackets at that position. You 547db96d56Sopenharmony_ci will see this notation frequently in the Python Library Reference.) 557db96d56Sopenharmony_ci 567db96d56Sopenharmony_ci 577db96d56Sopenharmony_ci.. method:: list.clear() 587db96d56Sopenharmony_ci :noindex: 597db96d56Sopenharmony_ci 607db96d56Sopenharmony_ci Remove all items from the list. Equivalent to ``del a[:]``. 617db96d56Sopenharmony_ci 627db96d56Sopenharmony_ci 637db96d56Sopenharmony_ci.. method:: list.index(x[, start[, end]]) 647db96d56Sopenharmony_ci :noindex: 657db96d56Sopenharmony_ci 667db96d56Sopenharmony_ci Return zero-based index in the list of the first item whose value is equal to *x*. 677db96d56Sopenharmony_ci Raises a :exc:`ValueError` if there is no such item. 687db96d56Sopenharmony_ci 697db96d56Sopenharmony_ci The optional arguments *start* and *end* are interpreted as in the slice 707db96d56Sopenharmony_ci notation and are used to limit the search to a particular subsequence of 717db96d56Sopenharmony_ci the list. The returned index is computed relative to the beginning of the full 727db96d56Sopenharmony_ci sequence rather than the *start* argument. 737db96d56Sopenharmony_ci 747db96d56Sopenharmony_ci 757db96d56Sopenharmony_ci.. method:: list.count(x) 767db96d56Sopenharmony_ci :noindex: 777db96d56Sopenharmony_ci 787db96d56Sopenharmony_ci Return the number of times *x* appears in the list. 797db96d56Sopenharmony_ci 807db96d56Sopenharmony_ci 817db96d56Sopenharmony_ci.. method:: list.sort(*, key=None, reverse=False) 827db96d56Sopenharmony_ci :noindex: 837db96d56Sopenharmony_ci 847db96d56Sopenharmony_ci Sort the items of the list in place (the arguments can be used for sort 857db96d56Sopenharmony_ci customization, see :func:`sorted` for their explanation). 867db96d56Sopenharmony_ci 877db96d56Sopenharmony_ci 887db96d56Sopenharmony_ci.. method:: list.reverse() 897db96d56Sopenharmony_ci :noindex: 907db96d56Sopenharmony_ci 917db96d56Sopenharmony_ci Reverse the elements of the list in place. 927db96d56Sopenharmony_ci 937db96d56Sopenharmony_ci 947db96d56Sopenharmony_ci.. method:: list.copy() 957db96d56Sopenharmony_ci :noindex: 967db96d56Sopenharmony_ci 977db96d56Sopenharmony_ci Return a shallow copy of the list. Equivalent to ``a[:]``. 987db96d56Sopenharmony_ci 997db96d56Sopenharmony_ci 1007db96d56Sopenharmony_ciAn example that uses most of the list methods:: 1017db96d56Sopenharmony_ci 1027db96d56Sopenharmony_ci >>> fruits = ['orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana'] 1037db96d56Sopenharmony_ci >>> fruits.count('apple') 1047db96d56Sopenharmony_ci 2 1057db96d56Sopenharmony_ci >>> fruits.count('tangerine') 1067db96d56Sopenharmony_ci 0 1077db96d56Sopenharmony_ci >>> fruits.index('banana') 1087db96d56Sopenharmony_ci 3 1097db96d56Sopenharmony_ci >>> fruits.index('banana', 4) # Find next banana starting at position 4 1107db96d56Sopenharmony_ci 6 1117db96d56Sopenharmony_ci >>> fruits.reverse() 1127db96d56Sopenharmony_ci >>> fruits 1137db96d56Sopenharmony_ci ['banana', 'apple', 'kiwi', 'banana', 'pear', 'apple', 'orange'] 1147db96d56Sopenharmony_ci >>> fruits.append('grape') 1157db96d56Sopenharmony_ci >>> fruits 1167db96d56Sopenharmony_ci ['banana', 'apple', 'kiwi', 'banana', 'pear', 'apple', 'orange', 'grape'] 1177db96d56Sopenharmony_ci >>> fruits.sort() 1187db96d56Sopenharmony_ci >>> fruits 1197db96d56Sopenharmony_ci ['apple', 'apple', 'banana', 'banana', 'grape', 'kiwi', 'orange', 'pear'] 1207db96d56Sopenharmony_ci >>> fruits.pop() 1217db96d56Sopenharmony_ci 'pear' 1227db96d56Sopenharmony_ci 1237db96d56Sopenharmony_ciYou might have noticed that methods like ``insert``, ``remove`` or ``sort`` that 1247db96d56Sopenharmony_cionly modify the list have no return value printed -- they return the default 1257db96d56Sopenharmony_ci``None``. [#]_ This is a design principle for all mutable data structures in 1267db96d56Sopenharmony_ciPython. 1277db96d56Sopenharmony_ci 1287db96d56Sopenharmony_ciAnother thing you might notice is that not all data can be sorted or 1297db96d56Sopenharmony_cicompared. For instance, ``[None, 'hello', 10]`` doesn't sort because 1307db96d56Sopenharmony_ciintegers can't be compared to strings and *None* can't be compared to 1317db96d56Sopenharmony_ciother types. Also, there are some types that don't have a defined 1327db96d56Sopenharmony_ciordering relation. For example, ``3+4j < 5+7j`` isn't a valid 1337db96d56Sopenharmony_cicomparison. 1347db96d56Sopenharmony_ci 1357db96d56Sopenharmony_ci 1367db96d56Sopenharmony_ci.. _tut-lists-as-stacks: 1377db96d56Sopenharmony_ci 1387db96d56Sopenharmony_ciUsing Lists as Stacks 1397db96d56Sopenharmony_ci--------------------- 1407db96d56Sopenharmony_ci 1417db96d56Sopenharmony_ci.. sectionauthor:: Ka-Ping Yee <ping@lfw.org> 1427db96d56Sopenharmony_ci 1437db96d56Sopenharmony_ci 1447db96d56Sopenharmony_ciThe list methods make it very easy to use a list as a stack, where the last 1457db96d56Sopenharmony_cielement added is the first element retrieved ("last-in, first-out"). To add an 1467db96d56Sopenharmony_ciitem to the top of the stack, use :meth:`append`. To retrieve an item from the 1477db96d56Sopenharmony_citop of the stack, use :meth:`pop` without an explicit index. For example:: 1487db96d56Sopenharmony_ci 1497db96d56Sopenharmony_ci >>> stack = [3, 4, 5] 1507db96d56Sopenharmony_ci >>> stack.append(6) 1517db96d56Sopenharmony_ci >>> stack.append(7) 1527db96d56Sopenharmony_ci >>> stack 1537db96d56Sopenharmony_ci [3, 4, 5, 6, 7] 1547db96d56Sopenharmony_ci >>> stack.pop() 1557db96d56Sopenharmony_ci 7 1567db96d56Sopenharmony_ci >>> stack 1577db96d56Sopenharmony_ci [3, 4, 5, 6] 1587db96d56Sopenharmony_ci >>> stack.pop() 1597db96d56Sopenharmony_ci 6 1607db96d56Sopenharmony_ci >>> stack.pop() 1617db96d56Sopenharmony_ci 5 1627db96d56Sopenharmony_ci >>> stack 1637db96d56Sopenharmony_ci [3, 4] 1647db96d56Sopenharmony_ci 1657db96d56Sopenharmony_ci 1667db96d56Sopenharmony_ci.. _tut-lists-as-queues: 1677db96d56Sopenharmony_ci 1687db96d56Sopenharmony_ciUsing Lists as Queues 1697db96d56Sopenharmony_ci--------------------- 1707db96d56Sopenharmony_ci 1717db96d56Sopenharmony_ci.. sectionauthor:: Ka-Ping Yee <ping@lfw.org> 1727db96d56Sopenharmony_ci 1737db96d56Sopenharmony_ciIt is also possible to use a list as a queue, where the first element added is 1747db96d56Sopenharmony_cithe first element retrieved ("first-in, first-out"); however, lists are not 1757db96d56Sopenharmony_ciefficient for this purpose. While appends and pops from the end of list are 1767db96d56Sopenharmony_cifast, doing inserts or pops from the beginning of a list is slow (because all 1777db96d56Sopenharmony_ciof the other elements have to be shifted by one). 1787db96d56Sopenharmony_ci 1797db96d56Sopenharmony_ciTo implement a queue, use :class:`collections.deque` which was designed to 1807db96d56Sopenharmony_cihave fast appends and pops from both ends. For example:: 1817db96d56Sopenharmony_ci 1827db96d56Sopenharmony_ci >>> from collections import deque 1837db96d56Sopenharmony_ci >>> queue = deque(["Eric", "John", "Michael"]) 1847db96d56Sopenharmony_ci >>> queue.append("Terry") # Terry arrives 1857db96d56Sopenharmony_ci >>> queue.append("Graham") # Graham arrives 1867db96d56Sopenharmony_ci >>> queue.popleft() # The first to arrive now leaves 1877db96d56Sopenharmony_ci 'Eric' 1887db96d56Sopenharmony_ci >>> queue.popleft() # The second to arrive now leaves 1897db96d56Sopenharmony_ci 'John' 1907db96d56Sopenharmony_ci >>> queue # Remaining queue in order of arrival 1917db96d56Sopenharmony_ci deque(['Michael', 'Terry', 'Graham']) 1927db96d56Sopenharmony_ci 1937db96d56Sopenharmony_ci 1947db96d56Sopenharmony_ci.. _tut-listcomps: 1957db96d56Sopenharmony_ci 1967db96d56Sopenharmony_ciList Comprehensions 1977db96d56Sopenharmony_ci------------------- 1987db96d56Sopenharmony_ci 1997db96d56Sopenharmony_ciList comprehensions provide a concise way to create lists. 2007db96d56Sopenharmony_ciCommon applications are to make new lists where each element is the result of 2017db96d56Sopenharmony_cisome operations applied to each member of another sequence or iterable, or to 2027db96d56Sopenharmony_cicreate a subsequence of those elements that satisfy a certain condition. 2037db96d56Sopenharmony_ci 2047db96d56Sopenharmony_ciFor example, assume we want to create a list of squares, like:: 2057db96d56Sopenharmony_ci 2067db96d56Sopenharmony_ci >>> squares = [] 2077db96d56Sopenharmony_ci >>> for x in range(10): 2087db96d56Sopenharmony_ci ... squares.append(x**2) 2097db96d56Sopenharmony_ci ... 2107db96d56Sopenharmony_ci >>> squares 2117db96d56Sopenharmony_ci [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] 2127db96d56Sopenharmony_ci 2137db96d56Sopenharmony_ciNote that this creates (or overwrites) a variable named ``x`` that still exists 2147db96d56Sopenharmony_ciafter the loop completes. We can calculate the list of squares without any 2157db96d56Sopenharmony_ciside effects using:: 2167db96d56Sopenharmony_ci 2177db96d56Sopenharmony_ci squares = list(map(lambda x: x**2, range(10))) 2187db96d56Sopenharmony_ci 2197db96d56Sopenharmony_cior, equivalently:: 2207db96d56Sopenharmony_ci 2217db96d56Sopenharmony_ci squares = [x**2 for x in range(10)] 2227db96d56Sopenharmony_ci 2237db96d56Sopenharmony_ciwhich is more concise and readable. 2247db96d56Sopenharmony_ci 2257db96d56Sopenharmony_ciA list comprehension consists of brackets containing an expression followed 2267db96d56Sopenharmony_ciby a :keyword:`!for` clause, then zero or more :keyword:`!for` or :keyword:`!if` 2277db96d56Sopenharmony_ciclauses. The result will be a new list resulting from evaluating the expression 2287db96d56Sopenharmony_ciin the context of the :keyword:`!for` and :keyword:`!if` clauses which follow it. 2297db96d56Sopenharmony_ciFor example, this listcomp combines the elements of two lists if they are not 2307db96d56Sopenharmony_ciequal:: 2317db96d56Sopenharmony_ci 2327db96d56Sopenharmony_ci >>> [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y] 2337db96d56Sopenharmony_ci [(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)] 2347db96d56Sopenharmony_ci 2357db96d56Sopenharmony_ciand it's equivalent to:: 2367db96d56Sopenharmony_ci 2377db96d56Sopenharmony_ci >>> combs = [] 2387db96d56Sopenharmony_ci >>> for x in [1,2,3]: 2397db96d56Sopenharmony_ci ... for y in [3,1,4]: 2407db96d56Sopenharmony_ci ... if x != y: 2417db96d56Sopenharmony_ci ... combs.append((x, y)) 2427db96d56Sopenharmony_ci ... 2437db96d56Sopenharmony_ci >>> combs 2447db96d56Sopenharmony_ci [(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)] 2457db96d56Sopenharmony_ci 2467db96d56Sopenharmony_ciNote how the order of the :keyword:`for` and :keyword:`if` statements is the 2477db96d56Sopenharmony_cisame in both these snippets. 2487db96d56Sopenharmony_ci 2497db96d56Sopenharmony_ciIf the expression is a tuple (e.g. the ``(x, y)`` in the previous example), 2507db96d56Sopenharmony_ciit must be parenthesized. :: 2517db96d56Sopenharmony_ci 2527db96d56Sopenharmony_ci >>> vec = [-4, -2, 0, 2, 4] 2537db96d56Sopenharmony_ci >>> # create a new list with the values doubled 2547db96d56Sopenharmony_ci >>> [x*2 for x in vec] 2557db96d56Sopenharmony_ci [-8, -4, 0, 4, 8] 2567db96d56Sopenharmony_ci >>> # filter the list to exclude negative numbers 2577db96d56Sopenharmony_ci >>> [x for x in vec if x >= 0] 2587db96d56Sopenharmony_ci [0, 2, 4] 2597db96d56Sopenharmony_ci >>> # apply a function to all the elements 2607db96d56Sopenharmony_ci >>> [abs(x) for x in vec] 2617db96d56Sopenharmony_ci [4, 2, 0, 2, 4] 2627db96d56Sopenharmony_ci >>> # call a method on each element 2637db96d56Sopenharmony_ci >>> freshfruit = [' banana', ' loganberry ', 'passion fruit '] 2647db96d56Sopenharmony_ci >>> [weapon.strip() for weapon in freshfruit] 2657db96d56Sopenharmony_ci ['banana', 'loganberry', 'passion fruit'] 2667db96d56Sopenharmony_ci >>> # create a list of 2-tuples like (number, square) 2677db96d56Sopenharmony_ci >>> [(x, x**2) for x in range(6)] 2687db96d56Sopenharmony_ci [(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25)] 2697db96d56Sopenharmony_ci >>> # the tuple must be parenthesized, otherwise an error is raised 2707db96d56Sopenharmony_ci >>> [x, x**2 for x in range(6)] 2717db96d56Sopenharmony_ci File "<stdin>", line 1 2727db96d56Sopenharmony_ci [x, x**2 for x in range(6)] 2737db96d56Sopenharmony_ci ^^^^^^^ 2747db96d56Sopenharmony_ci SyntaxError: did you forget parentheses around the comprehension target? 2757db96d56Sopenharmony_ci >>> # flatten a list using a listcomp with two 'for' 2767db96d56Sopenharmony_ci >>> vec = [[1,2,3], [4,5,6], [7,8,9]] 2777db96d56Sopenharmony_ci >>> [num for elem in vec for num in elem] 2787db96d56Sopenharmony_ci [1, 2, 3, 4, 5, 6, 7, 8, 9] 2797db96d56Sopenharmony_ci 2807db96d56Sopenharmony_ciList comprehensions can contain complex expressions and nested functions:: 2817db96d56Sopenharmony_ci 2827db96d56Sopenharmony_ci >>> from math import pi 2837db96d56Sopenharmony_ci >>> [str(round(pi, i)) for i in range(1, 6)] 2847db96d56Sopenharmony_ci ['3.1', '3.14', '3.142', '3.1416', '3.14159'] 2857db96d56Sopenharmony_ci 2867db96d56Sopenharmony_ciNested List Comprehensions 2877db96d56Sopenharmony_ci-------------------------- 2887db96d56Sopenharmony_ci 2897db96d56Sopenharmony_ciThe initial expression in a list comprehension can be any arbitrary expression, 2907db96d56Sopenharmony_ciincluding another list comprehension. 2917db96d56Sopenharmony_ci 2927db96d56Sopenharmony_ciConsider the following example of a 3x4 matrix implemented as a list of 2937db96d56Sopenharmony_ci3 lists of length 4:: 2947db96d56Sopenharmony_ci 2957db96d56Sopenharmony_ci >>> matrix = [ 2967db96d56Sopenharmony_ci ... [1, 2, 3, 4], 2977db96d56Sopenharmony_ci ... [5, 6, 7, 8], 2987db96d56Sopenharmony_ci ... [9, 10, 11, 12], 2997db96d56Sopenharmony_ci ... ] 3007db96d56Sopenharmony_ci 3017db96d56Sopenharmony_ciThe following list comprehension will transpose rows and columns:: 3027db96d56Sopenharmony_ci 3037db96d56Sopenharmony_ci >>> [[row[i] for row in matrix] for i in range(4)] 3047db96d56Sopenharmony_ci [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]] 3057db96d56Sopenharmony_ci 3067db96d56Sopenharmony_ciAs we saw in the previous section, the inner list comprehension is evaluated in 3077db96d56Sopenharmony_cithe context of the :keyword:`for` that follows it, so this example is 3087db96d56Sopenharmony_ciequivalent to:: 3097db96d56Sopenharmony_ci 3107db96d56Sopenharmony_ci >>> transposed = [] 3117db96d56Sopenharmony_ci >>> for i in range(4): 3127db96d56Sopenharmony_ci ... transposed.append([row[i] for row in matrix]) 3137db96d56Sopenharmony_ci ... 3147db96d56Sopenharmony_ci >>> transposed 3157db96d56Sopenharmony_ci [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]] 3167db96d56Sopenharmony_ci 3177db96d56Sopenharmony_ciwhich, in turn, is the same as:: 3187db96d56Sopenharmony_ci 3197db96d56Sopenharmony_ci >>> transposed = [] 3207db96d56Sopenharmony_ci >>> for i in range(4): 3217db96d56Sopenharmony_ci ... # the following 3 lines implement the nested listcomp 3227db96d56Sopenharmony_ci ... transposed_row = [] 3237db96d56Sopenharmony_ci ... for row in matrix: 3247db96d56Sopenharmony_ci ... transposed_row.append(row[i]) 3257db96d56Sopenharmony_ci ... transposed.append(transposed_row) 3267db96d56Sopenharmony_ci ... 3277db96d56Sopenharmony_ci >>> transposed 3287db96d56Sopenharmony_ci [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]] 3297db96d56Sopenharmony_ci 3307db96d56Sopenharmony_ciIn the real world, you should prefer built-in functions to complex flow statements. 3317db96d56Sopenharmony_ciThe :func:`zip` function would do a great job for this use case:: 3327db96d56Sopenharmony_ci 3337db96d56Sopenharmony_ci >>> list(zip(*matrix)) 3347db96d56Sopenharmony_ci [(1, 5, 9), (2, 6, 10), (3, 7, 11), (4, 8, 12)] 3357db96d56Sopenharmony_ci 3367db96d56Sopenharmony_ciSee :ref:`tut-unpacking-arguments` for details on the asterisk in this line. 3377db96d56Sopenharmony_ci 3387db96d56Sopenharmony_ci.. _tut-del: 3397db96d56Sopenharmony_ci 3407db96d56Sopenharmony_ciThe :keyword:`!del` statement 3417db96d56Sopenharmony_ci============================= 3427db96d56Sopenharmony_ci 3437db96d56Sopenharmony_ciThere is a way to remove an item from a list given its index instead of its 3447db96d56Sopenharmony_civalue: the :keyword:`del` statement. This differs from the :meth:`pop` method 3457db96d56Sopenharmony_ciwhich returns a value. The :keyword:`!del` statement can also be used to remove 3467db96d56Sopenharmony_cislices from a list or clear the entire list (which we did earlier by assignment 3477db96d56Sopenharmony_ciof an empty list to the slice). For example:: 3487db96d56Sopenharmony_ci 3497db96d56Sopenharmony_ci >>> a = [-1, 1, 66.25, 333, 333, 1234.5] 3507db96d56Sopenharmony_ci >>> del a[0] 3517db96d56Sopenharmony_ci >>> a 3527db96d56Sopenharmony_ci [1, 66.25, 333, 333, 1234.5] 3537db96d56Sopenharmony_ci >>> del a[2:4] 3547db96d56Sopenharmony_ci >>> a 3557db96d56Sopenharmony_ci [1, 66.25, 1234.5] 3567db96d56Sopenharmony_ci >>> del a[:] 3577db96d56Sopenharmony_ci >>> a 3587db96d56Sopenharmony_ci [] 3597db96d56Sopenharmony_ci 3607db96d56Sopenharmony_ci:keyword:`del` can also be used to delete entire variables:: 3617db96d56Sopenharmony_ci 3627db96d56Sopenharmony_ci >>> del a 3637db96d56Sopenharmony_ci 3647db96d56Sopenharmony_ciReferencing the name ``a`` hereafter is an error (at least until another value 3657db96d56Sopenharmony_ciis assigned to it). We'll find other uses for :keyword:`del` later. 3667db96d56Sopenharmony_ci 3677db96d56Sopenharmony_ci 3687db96d56Sopenharmony_ci.. _tut-tuples: 3697db96d56Sopenharmony_ci 3707db96d56Sopenharmony_ciTuples and Sequences 3717db96d56Sopenharmony_ci==================== 3727db96d56Sopenharmony_ci 3737db96d56Sopenharmony_ciWe saw that lists and strings have many common properties, such as indexing and 3747db96d56Sopenharmony_cislicing operations. They are two examples of *sequence* data types (see 3757db96d56Sopenharmony_ci:ref:`typesseq`). Since Python is an evolving language, other sequence data 3767db96d56Sopenharmony_citypes may be added. There is also another standard sequence data type: the 3777db96d56Sopenharmony_ci*tuple*. 3787db96d56Sopenharmony_ci 3797db96d56Sopenharmony_ciA tuple consists of a number of values separated by commas, for instance:: 3807db96d56Sopenharmony_ci 3817db96d56Sopenharmony_ci >>> t = 12345, 54321, 'hello!' 3827db96d56Sopenharmony_ci >>> t[0] 3837db96d56Sopenharmony_ci 12345 3847db96d56Sopenharmony_ci >>> t 3857db96d56Sopenharmony_ci (12345, 54321, 'hello!') 3867db96d56Sopenharmony_ci >>> # Tuples may be nested: 3877db96d56Sopenharmony_ci ... u = t, (1, 2, 3, 4, 5) 3887db96d56Sopenharmony_ci >>> u 3897db96d56Sopenharmony_ci ((12345, 54321, 'hello!'), (1, 2, 3, 4, 5)) 3907db96d56Sopenharmony_ci >>> # Tuples are immutable: 3917db96d56Sopenharmony_ci ... t[0] = 88888 3927db96d56Sopenharmony_ci Traceback (most recent call last): 3937db96d56Sopenharmony_ci File "<stdin>", line 1, in <module> 3947db96d56Sopenharmony_ci TypeError: 'tuple' object does not support item assignment 3957db96d56Sopenharmony_ci >>> # but they can contain mutable objects: 3967db96d56Sopenharmony_ci ... v = ([1, 2, 3], [3, 2, 1]) 3977db96d56Sopenharmony_ci >>> v 3987db96d56Sopenharmony_ci ([1, 2, 3], [3, 2, 1]) 3997db96d56Sopenharmony_ci 4007db96d56Sopenharmony_ci 4017db96d56Sopenharmony_ciAs you see, on output tuples are always enclosed in parentheses, so that nested 4027db96d56Sopenharmony_cituples are interpreted correctly; they may be input with or without surrounding 4037db96d56Sopenharmony_ciparentheses, although often parentheses are necessary anyway (if the tuple is 4047db96d56Sopenharmony_cipart of a larger expression). It is not possible to assign to the individual 4057db96d56Sopenharmony_ciitems of a tuple, however it is possible to create tuples which contain mutable 4067db96d56Sopenharmony_ciobjects, such as lists. 4077db96d56Sopenharmony_ci 4087db96d56Sopenharmony_ciThough tuples may seem similar to lists, they are often used in different 4097db96d56Sopenharmony_cisituations and for different purposes. 4107db96d56Sopenharmony_ciTuples are :term:`immutable`, and usually contain a heterogeneous sequence of 4117db96d56Sopenharmony_cielements that are accessed via unpacking (see later in this section) or indexing 4127db96d56Sopenharmony_ci(or even by attribute in the case of :func:`namedtuples <collections.namedtuple>`). 4137db96d56Sopenharmony_ciLists are :term:`mutable`, and their elements are usually homogeneous and are 4147db96d56Sopenharmony_ciaccessed by iterating over the list. 4157db96d56Sopenharmony_ci 4167db96d56Sopenharmony_ciA special problem is the construction of tuples containing 0 or 1 items: the 4177db96d56Sopenharmony_cisyntax has some extra quirks to accommodate these. Empty tuples are constructed 4187db96d56Sopenharmony_ciby an empty pair of parentheses; a tuple with one item is constructed by 4197db96d56Sopenharmony_cifollowing a value with a comma (it is not sufficient to enclose a single value 4207db96d56Sopenharmony_ciin parentheses). Ugly, but effective. For example:: 4217db96d56Sopenharmony_ci 4227db96d56Sopenharmony_ci >>> empty = () 4237db96d56Sopenharmony_ci >>> singleton = 'hello', # <-- note trailing comma 4247db96d56Sopenharmony_ci >>> len(empty) 4257db96d56Sopenharmony_ci 0 4267db96d56Sopenharmony_ci >>> len(singleton) 4277db96d56Sopenharmony_ci 1 4287db96d56Sopenharmony_ci >>> singleton 4297db96d56Sopenharmony_ci ('hello',) 4307db96d56Sopenharmony_ci 4317db96d56Sopenharmony_ciThe statement ``t = 12345, 54321, 'hello!'`` is an example of *tuple packing*: 4327db96d56Sopenharmony_cithe values ``12345``, ``54321`` and ``'hello!'`` are packed together in a tuple. 4337db96d56Sopenharmony_ciThe reverse operation is also possible:: 4347db96d56Sopenharmony_ci 4357db96d56Sopenharmony_ci >>> x, y, z = t 4367db96d56Sopenharmony_ci 4377db96d56Sopenharmony_ciThis is called, appropriately enough, *sequence unpacking* and works for any 4387db96d56Sopenharmony_cisequence on the right-hand side. Sequence unpacking requires that there are as 4397db96d56Sopenharmony_cimany variables on the left side of the equals sign as there are elements in the 4407db96d56Sopenharmony_cisequence. Note that multiple assignment is really just a combination of tuple 4417db96d56Sopenharmony_cipacking and sequence unpacking. 4427db96d56Sopenharmony_ci 4437db96d56Sopenharmony_ci 4447db96d56Sopenharmony_ci.. _tut-sets: 4457db96d56Sopenharmony_ci 4467db96d56Sopenharmony_ciSets 4477db96d56Sopenharmony_ci==== 4487db96d56Sopenharmony_ci 4497db96d56Sopenharmony_ciPython also includes a data type for *sets*. A set is an unordered collection 4507db96d56Sopenharmony_ciwith no duplicate elements. Basic uses include membership testing and 4517db96d56Sopenharmony_cieliminating duplicate entries. Set objects also support mathematical operations 4527db96d56Sopenharmony_cilike union, intersection, difference, and symmetric difference. 4537db96d56Sopenharmony_ci 4547db96d56Sopenharmony_ciCurly braces or the :func:`set` function can be used to create sets. Note: to 4557db96d56Sopenharmony_cicreate an empty set you have to use ``set()``, not ``{}``; the latter creates an 4567db96d56Sopenharmony_ciempty dictionary, a data structure that we discuss in the next section. 4577db96d56Sopenharmony_ci 4587db96d56Sopenharmony_ciHere is a brief demonstration:: 4597db96d56Sopenharmony_ci 4607db96d56Sopenharmony_ci >>> basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'} 4617db96d56Sopenharmony_ci >>> print(basket) # show that duplicates have been removed 4627db96d56Sopenharmony_ci {'orange', 'banana', 'pear', 'apple'} 4637db96d56Sopenharmony_ci >>> 'orange' in basket # fast membership testing 4647db96d56Sopenharmony_ci True 4657db96d56Sopenharmony_ci >>> 'crabgrass' in basket 4667db96d56Sopenharmony_ci False 4677db96d56Sopenharmony_ci 4687db96d56Sopenharmony_ci >>> # Demonstrate set operations on unique letters from two words 4697db96d56Sopenharmony_ci ... 4707db96d56Sopenharmony_ci >>> a = set('abracadabra') 4717db96d56Sopenharmony_ci >>> b = set('alacazam') 4727db96d56Sopenharmony_ci >>> a # unique letters in a 4737db96d56Sopenharmony_ci {'a', 'r', 'b', 'c', 'd'} 4747db96d56Sopenharmony_ci >>> a - b # letters in a but not in b 4757db96d56Sopenharmony_ci {'r', 'd', 'b'} 4767db96d56Sopenharmony_ci >>> a | b # letters in a or b or both 4777db96d56Sopenharmony_ci {'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'} 4787db96d56Sopenharmony_ci >>> a & b # letters in both a and b 4797db96d56Sopenharmony_ci {'a', 'c'} 4807db96d56Sopenharmony_ci >>> a ^ b # letters in a or b but not both 4817db96d56Sopenharmony_ci {'r', 'd', 'b', 'm', 'z', 'l'} 4827db96d56Sopenharmony_ci 4837db96d56Sopenharmony_ciSimilarly to :ref:`list comprehensions <tut-listcomps>`, set comprehensions 4847db96d56Sopenharmony_ciare also supported:: 4857db96d56Sopenharmony_ci 4867db96d56Sopenharmony_ci >>> a = {x for x in 'abracadabra' if x not in 'abc'} 4877db96d56Sopenharmony_ci >>> a 4887db96d56Sopenharmony_ci {'r', 'd'} 4897db96d56Sopenharmony_ci 4907db96d56Sopenharmony_ci 4917db96d56Sopenharmony_ci.. _tut-dictionaries: 4927db96d56Sopenharmony_ci 4937db96d56Sopenharmony_ciDictionaries 4947db96d56Sopenharmony_ci============ 4957db96d56Sopenharmony_ci 4967db96d56Sopenharmony_ciAnother useful data type built into Python is the *dictionary* (see 4977db96d56Sopenharmony_ci:ref:`typesmapping`). Dictionaries are sometimes found in other languages as 4987db96d56Sopenharmony_ci"associative memories" or "associative arrays". Unlike sequences, which are 4997db96d56Sopenharmony_ciindexed by a range of numbers, dictionaries are indexed by *keys*, which can be 5007db96d56Sopenharmony_ciany immutable type; strings and numbers can always be keys. Tuples can be used 5017db96d56Sopenharmony_cias keys if they contain only strings, numbers, or tuples; if a tuple contains 5027db96d56Sopenharmony_ciany mutable object either directly or indirectly, it cannot be used as a key. 5037db96d56Sopenharmony_ciYou can't use lists as keys, since lists can be modified in place using index 5047db96d56Sopenharmony_ciassignments, slice assignments, or methods like :meth:`append` and 5057db96d56Sopenharmony_ci:meth:`extend`. 5067db96d56Sopenharmony_ci 5077db96d56Sopenharmony_ciIt is best to think of a dictionary as a set of *key: value* pairs, 5087db96d56Sopenharmony_ciwith the requirement that the keys are unique (within one dictionary). A pair of 5097db96d56Sopenharmony_cibraces creates an empty dictionary: ``{}``. Placing a comma-separated list of 5107db96d56Sopenharmony_cikey:value pairs within the braces adds initial key:value pairs to the 5117db96d56Sopenharmony_cidictionary; this is also the way dictionaries are written on output. 5127db96d56Sopenharmony_ci 5137db96d56Sopenharmony_ciThe main operations on a dictionary are storing a value with some key and 5147db96d56Sopenharmony_ciextracting the value given the key. It is also possible to delete a key:value 5157db96d56Sopenharmony_cipair with ``del``. If you store using a key that is already in use, the old 5167db96d56Sopenharmony_civalue associated with that key is forgotten. It is an error to extract a value 5177db96d56Sopenharmony_ciusing a non-existent key. 5187db96d56Sopenharmony_ci 5197db96d56Sopenharmony_ciPerforming ``list(d)`` on a dictionary returns a list of all the keys 5207db96d56Sopenharmony_ciused in the dictionary, in insertion order (if you want it sorted, just use 5217db96d56Sopenharmony_ci``sorted(d)`` instead). To check whether a single key is in the 5227db96d56Sopenharmony_cidictionary, use the :keyword:`in` keyword. 5237db96d56Sopenharmony_ci 5247db96d56Sopenharmony_ciHere is a small example using a dictionary:: 5257db96d56Sopenharmony_ci 5267db96d56Sopenharmony_ci >>> tel = {'jack': 4098, 'sape': 4139} 5277db96d56Sopenharmony_ci >>> tel['guido'] = 4127 5287db96d56Sopenharmony_ci >>> tel 5297db96d56Sopenharmony_ci {'jack': 4098, 'sape': 4139, 'guido': 4127} 5307db96d56Sopenharmony_ci >>> tel['jack'] 5317db96d56Sopenharmony_ci 4098 5327db96d56Sopenharmony_ci >>> del tel['sape'] 5337db96d56Sopenharmony_ci >>> tel['irv'] = 4127 5347db96d56Sopenharmony_ci >>> tel 5357db96d56Sopenharmony_ci {'jack': 4098, 'guido': 4127, 'irv': 4127} 5367db96d56Sopenharmony_ci >>> list(tel) 5377db96d56Sopenharmony_ci ['jack', 'guido', 'irv'] 5387db96d56Sopenharmony_ci >>> sorted(tel) 5397db96d56Sopenharmony_ci ['guido', 'irv', 'jack'] 5407db96d56Sopenharmony_ci >>> 'guido' in tel 5417db96d56Sopenharmony_ci True 5427db96d56Sopenharmony_ci >>> 'jack' not in tel 5437db96d56Sopenharmony_ci False 5447db96d56Sopenharmony_ci 5457db96d56Sopenharmony_ciThe :func:`dict` constructor builds dictionaries directly from sequences of 5467db96d56Sopenharmony_cikey-value pairs:: 5477db96d56Sopenharmony_ci 5487db96d56Sopenharmony_ci >>> dict([('sape', 4139), ('guido', 4127), ('jack', 4098)]) 5497db96d56Sopenharmony_ci {'sape': 4139, 'guido': 4127, 'jack': 4098} 5507db96d56Sopenharmony_ci 5517db96d56Sopenharmony_ciIn addition, dict comprehensions can be used to create dictionaries from 5527db96d56Sopenharmony_ciarbitrary key and value expressions:: 5537db96d56Sopenharmony_ci 5547db96d56Sopenharmony_ci >>> {x: x**2 for x in (2, 4, 6)} 5557db96d56Sopenharmony_ci {2: 4, 4: 16, 6: 36} 5567db96d56Sopenharmony_ci 5577db96d56Sopenharmony_ciWhen the keys are simple strings, it is sometimes easier to specify pairs using 5587db96d56Sopenharmony_cikeyword arguments:: 5597db96d56Sopenharmony_ci 5607db96d56Sopenharmony_ci >>> dict(sape=4139, guido=4127, jack=4098) 5617db96d56Sopenharmony_ci {'sape': 4139, 'guido': 4127, 'jack': 4098} 5627db96d56Sopenharmony_ci 5637db96d56Sopenharmony_ci 5647db96d56Sopenharmony_ci.. _tut-loopidioms: 5657db96d56Sopenharmony_ci 5667db96d56Sopenharmony_ciLooping Techniques 5677db96d56Sopenharmony_ci================== 5687db96d56Sopenharmony_ci 5697db96d56Sopenharmony_ciWhen looping through dictionaries, the key and corresponding value can be 5707db96d56Sopenharmony_ciretrieved at the same time using the :meth:`items` method. :: 5717db96d56Sopenharmony_ci 5727db96d56Sopenharmony_ci >>> knights = {'gallahad': 'the pure', 'robin': 'the brave'} 5737db96d56Sopenharmony_ci >>> for k, v in knights.items(): 5747db96d56Sopenharmony_ci ... print(k, v) 5757db96d56Sopenharmony_ci ... 5767db96d56Sopenharmony_ci gallahad the pure 5777db96d56Sopenharmony_ci robin the brave 5787db96d56Sopenharmony_ci 5797db96d56Sopenharmony_ciWhen looping through a sequence, the position index and corresponding value can 5807db96d56Sopenharmony_cibe retrieved at the same time using the :func:`enumerate` function. :: 5817db96d56Sopenharmony_ci 5827db96d56Sopenharmony_ci >>> for i, v in enumerate(['tic', 'tac', 'toe']): 5837db96d56Sopenharmony_ci ... print(i, v) 5847db96d56Sopenharmony_ci ... 5857db96d56Sopenharmony_ci 0 tic 5867db96d56Sopenharmony_ci 1 tac 5877db96d56Sopenharmony_ci 2 toe 5887db96d56Sopenharmony_ci 5897db96d56Sopenharmony_ciTo loop over two or more sequences at the same time, the entries can be paired 5907db96d56Sopenharmony_ciwith the :func:`zip` function. :: 5917db96d56Sopenharmony_ci 5927db96d56Sopenharmony_ci >>> questions = ['name', 'quest', 'favorite color'] 5937db96d56Sopenharmony_ci >>> answers = ['lancelot', 'the holy grail', 'blue'] 5947db96d56Sopenharmony_ci >>> for q, a in zip(questions, answers): 5957db96d56Sopenharmony_ci ... print('What is your {0}? It is {1}.'.format(q, a)) 5967db96d56Sopenharmony_ci ... 5977db96d56Sopenharmony_ci What is your name? It is lancelot. 5987db96d56Sopenharmony_ci What is your quest? It is the holy grail. 5997db96d56Sopenharmony_ci What is your favorite color? It is blue. 6007db96d56Sopenharmony_ci 6017db96d56Sopenharmony_ciTo loop over a sequence in reverse, first specify the sequence in a forward 6027db96d56Sopenharmony_cidirection and then call the :func:`reversed` function. :: 6037db96d56Sopenharmony_ci 6047db96d56Sopenharmony_ci >>> for i in reversed(range(1, 10, 2)): 6057db96d56Sopenharmony_ci ... print(i) 6067db96d56Sopenharmony_ci ... 6077db96d56Sopenharmony_ci 9 6087db96d56Sopenharmony_ci 7 6097db96d56Sopenharmony_ci 5 6107db96d56Sopenharmony_ci 3 6117db96d56Sopenharmony_ci 1 6127db96d56Sopenharmony_ci 6137db96d56Sopenharmony_ciTo loop over a sequence in sorted order, use the :func:`sorted` function which 6147db96d56Sopenharmony_cireturns a new sorted list while leaving the source unaltered. :: 6157db96d56Sopenharmony_ci 6167db96d56Sopenharmony_ci >>> basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana'] 6177db96d56Sopenharmony_ci >>> for i in sorted(basket): 6187db96d56Sopenharmony_ci ... print(i) 6197db96d56Sopenharmony_ci ... 6207db96d56Sopenharmony_ci apple 6217db96d56Sopenharmony_ci apple 6227db96d56Sopenharmony_ci banana 6237db96d56Sopenharmony_ci orange 6247db96d56Sopenharmony_ci orange 6257db96d56Sopenharmony_ci pear 6267db96d56Sopenharmony_ci 6277db96d56Sopenharmony_ciUsing :func:`set` on a sequence eliminates duplicate elements. The use of 6287db96d56Sopenharmony_ci:func:`sorted` in combination with :func:`set` over a sequence is an idiomatic 6297db96d56Sopenharmony_ciway to loop over unique elements of the sequence in sorted order. :: 6307db96d56Sopenharmony_ci 6317db96d56Sopenharmony_ci >>> basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana'] 6327db96d56Sopenharmony_ci >>> for f in sorted(set(basket)): 6337db96d56Sopenharmony_ci ... print(f) 6347db96d56Sopenharmony_ci ... 6357db96d56Sopenharmony_ci apple 6367db96d56Sopenharmony_ci banana 6377db96d56Sopenharmony_ci orange 6387db96d56Sopenharmony_ci pear 6397db96d56Sopenharmony_ci 6407db96d56Sopenharmony_ciIt is sometimes tempting to change a list while you are looping over it; 6417db96d56Sopenharmony_cihowever, it is often simpler and safer to create a new list instead. :: 6427db96d56Sopenharmony_ci 6437db96d56Sopenharmony_ci >>> import math 6447db96d56Sopenharmony_ci >>> raw_data = [56.2, float('NaN'), 51.7, 55.3, 52.5, float('NaN'), 47.8] 6457db96d56Sopenharmony_ci >>> filtered_data = [] 6467db96d56Sopenharmony_ci >>> for value in raw_data: 6477db96d56Sopenharmony_ci ... if not math.isnan(value): 6487db96d56Sopenharmony_ci ... filtered_data.append(value) 6497db96d56Sopenharmony_ci ... 6507db96d56Sopenharmony_ci >>> filtered_data 6517db96d56Sopenharmony_ci [56.2, 51.7, 55.3, 52.5, 47.8] 6527db96d56Sopenharmony_ci 6537db96d56Sopenharmony_ci 6547db96d56Sopenharmony_ci.. _tut-conditions: 6557db96d56Sopenharmony_ci 6567db96d56Sopenharmony_ciMore on Conditions 6577db96d56Sopenharmony_ci================== 6587db96d56Sopenharmony_ci 6597db96d56Sopenharmony_ciThe conditions used in ``while`` and ``if`` statements can contain any 6607db96d56Sopenharmony_cioperators, not just comparisons. 6617db96d56Sopenharmony_ci 6627db96d56Sopenharmony_ci 6637db96d56Sopenharmony_ciThe comparison operators ``in`` and ``not in`` are membership tests that 6647db96d56Sopenharmony_cidetermine whether a value is in (or not in) a container. The operators ``is`` 6657db96d56Sopenharmony_ciand ``is not`` compare whether two objects are really the same object. All 6667db96d56Sopenharmony_cicomparison operators have the same priority, which is lower than that of all 6677db96d56Sopenharmony_cinumerical operators. 6687db96d56Sopenharmony_ci 6697db96d56Sopenharmony_ciComparisons can be chained. For example, ``a < b == c`` tests whether ``a`` is 6707db96d56Sopenharmony_ciless than ``b`` and moreover ``b`` equals ``c``. 6717db96d56Sopenharmony_ci 6727db96d56Sopenharmony_ciComparisons may be combined using the Boolean operators ``and`` and ``or``, and 6737db96d56Sopenharmony_cithe outcome of a comparison (or of any other Boolean expression) may be negated 6747db96d56Sopenharmony_ciwith ``not``. These have lower priorities than comparison operators; between 6757db96d56Sopenharmony_cithem, ``not`` has the highest priority and ``or`` the lowest, so that ``A and 6767db96d56Sopenharmony_cinot B or C`` is equivalent to ``(A and (not B)) or C``. As always, parentheses 6777db96d56Sopenharmony_cican be used to express the desired composition. 6787db96d56Sopenharmony_ci 6797db96d56Sopenharmony_ciThe Boolean operators ``and`` and ``or`` are so-called *short-circuit* 6807db96d56Sopenharmony_cioperators: their arguments are evaluated from left to right, and evaluation 6817db96d56Sopenharmony_cistops as soon as the outcome is determined. For example, if ``A`` and ``C`` are 6827db96d56Sopenharmony_citrue but ``B`` is false, ``A and B and C`` does not evaluate the expression 6837db96d56Sopenharmony_ci``C``. When used as a general value and not as a Boolean, the return value of a 6847db96d56Sopenharmony_cishort-circuit operator is the last evaluated argument. 6857db96d56Sopenharmony_ci 6867db96d56Sopenharmony_ciIt is possible to assign the result of a comparison or other Boolean expression 6877db96d56Sopenharmony_cito a variable. For example, :: 6887db96d56Sopenharmony_ci 6897db96d56Sopenharmony_ci >>> string1, string2, string3 = '', 'Trondheim', 'Hammer Dance' 6907db96d56Sopenharmony_ci >>> non_null = string1 or string2 or string3 6917db96d56Sopenharmony_ci >>> non_null 6927db96d56Sopenharmony_ci 'Trondheim' 6937db96d56Sopenharmony_ci 6947db96d56Sopenharmony_ciNote that in Python, unlike C, assignment inside expressions must be done 6957db96d56Sopenharmony_ciexplicitly with the 6967db96d56Sopenharmony_ci:ref:`walrus operator <why-can-t-i-use-an-assignment-in-an-expression>` ``:=``. 6977db96d56Sopenharmony_ciThis avoids a common class of problems encountered in C programs: typing ``=`` 6987db96d56Sopenharmony_ciin an expression when ``==`` was intended. 6997db96d56Sopenharmony_ci 7007db96d56Sopenharmony_ci 7017db96d56Sopenharmony_ci.. _tut-comparing: 7027db96d56Sopenharmony_ci 7037db96d56Sopenharmony_ciComparing Sequences and Other Types 7047db96d56Sopenharmony_ci=================================== 7057db96d56Sopenharmony_ciSequence objects typically may be compared to other objects with the same sequence 7067db96d56Sopenharmony_citype. The comparison uses *lexicographical* ordering: first the first two 7077db96d56Sopenharmony_ciitems are compared, and if they differ this determines the outcome of the 7087db96d56Sopenharmony_cicomparison; if they are equal, the next two items are compared, and so on, until 7097db96d56Sopenharmony_cieither sequence is exhausted. If two items to be compared are themselves 7107db96d56Sopenharmony_cisequences of the same type, the lexicographical comparison is carried out 7117db96d56Sopenharmony_cirecursively. If all items of two sequences compare equal, the sequences are 7127db96d56Sopenharmony_ciconsidered equal. If one sequence is an initial sub-sequence of the other, the 7137db96d56Sopenharmony_cishorter sequence is the smaller (lesser) one. Lexicographical ordering for 7147db96d56Sopenharmony_cistrings uses the Unicode code point number to order individual characters. 7157db96d56Sopenharmony_ciSome examples of comparisons between sequences of the same type:: 7167db96d56Sopenharmony_ci 7177db96d56Sopenharmony_ci (1, 2, 3) < (1, 2, 4) 7187db96d56Sopenharmony_ci [1, 2, 3] < [1, 2, 4] 7197db96d56Sopenharmony_ci 'ABC' < 'C' < 'Pascal' < 'Python' 7207db96d56Sopenharmony_ci (1, 2, 3, 4) < (1, 2, 4) 7217db96d56Sopenharmony_ci (1, 2) < (1, 2, -1) 7227db96d56Sopenharmony_ci (1, 2, 3) == (1.0, 2.0, 3.0) 7237db96d56Sopenharmony_ci (1, 2, ('aa', 'ab')) < (1, 2, ('abc', 'a'), 4) 7247db96d56Sopenharmony_ci 7257db96d56Sopenharmony_ciNote that comparing objects of different types with ``<`` or ``>`` is legal 7267db96d56Sopenharmony_ciprovided that the objects have appropriate comparison methods. For example, 7277db96d56Sopenharmony_cimixed numeric types are compared according to their numeric value, so 0 equals 7287db96d56Sopenharmony_ci0.0, etc. Otherwise, rather than providing an arbitrary ordering, the 7297db96d56Sopenharmony_ciinterpreter will raise a :exc:`TypeError` exception. 7307db96d56Sopenharmony_ci 7317db96d56Sopenharmony_ci 7327db96d56Sopenharmony_ci.. rubric:: Footnotes 7337db96d56Sopenharmony_ci 7347db96d56Sopenharmony_ci.. [#] Other languages may return the mutated object, which allows method 7357db96d56Sopenharmony_ci chaining, such as ``d->insert("a")->remove("b")->sort();``. 736