Skip to main content
Engineering LibreTexts

10.2: Comparing Tuples

  • Page ID
    8645
  • \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \) \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)\(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\) \(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\)\(\newcommand{\AA}{\unicode[.8,0]{x212B}}\)

    The comparison operators work with tuples and other sequences. Python starts by comparing the first element from each sequence. If they are equal, it goes on to the next element, and so on, until it finds elements that differ. Subsequent elements are not considered (even if they are really big).

    >>> (0, 1, 2) < (0, 3, 4)
    True
    >>> (0, 1, 2000000) < (0, 3, 4)
    True

    The sort function works the same way. It sorts primarily by first element, but in the case of a tie, it sorts by second element, and so on.

    This feature lends itself to a pattern called DSU for

    Decorate
    a sequence by building a list of tuples with one or more sort keys preceding the elements from the sequence,
    Sort
    the list of tuples using the Python built-in sort, and
    Undecorate
    by extracting the sorted elements of the sequence.

    [DSU]

    For example, suppose you have a list of words and you want to sort them from longest to shortest:

    Code 10.2.1 (Python)
    %%python3
    
    txt = 'but soft what light in yonder window breaks'
    words = txt.split()
    t = list()
    for word in words:
        t.append((len(word), word))
    
    t.sort(reverse=True)
    
    res = list()
    for length, word in t:
        res.append(word)
    
    print(res)
    
    # Code: http://www.py4e.com/code3/soft.py
    
    

    The first loop builds a list of tuples, where each tuple is a word preceded by its length.

    sort compares the first element, length, first, and only considers the second element to break ties. The keyword argument reverse=True tells sort to go in decreasing order.

    The second loop traverses the list of tuples and builds a list of words in descending order of length. The four-character words are sorted in reverse alphabetical order, so "what" appears before "soft" in the following list.

    The output of the program is as follows:

    ['yonder', 'window', 'breaks', 'light', 'what',
    'soft', 'but', 'in']

    Of course the line loses much of its poetic impact when turned into a Python list and sorted in descending word length order.


    This page titled 10.2: Comparing Tuples is shared under a CC BY-NC-SA license and was authored, remixed, and/or curated by Chuck Severance.

    • Was this article helpful?