Skip to main content
Engineering LibreTexts

19.8: Named tuples

  • Page ID
  • \( \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}}\)

    Many simple objects are basically collections of related values. For example, the Point object defined in Chapter 15 contains two numbers, x and y. When you define a class like this, you usually start with an init method and a str method:

    class Point:
        def __init__(self, x=0, y=0):
            self.x = x
            self.y = y
        def __str__(self):
            return '(%g, %g)' % (self.x, self.y)

    This is a lot of code to convey a small amount of information. Python provides a more concise way to say the same thing:

    from collections import namedtuple
    Point = namedtuple('Point', ['x', 'y'])

    The first argument is the name of the class you want to create. The second is a list of the attributes Point objects should have, as strings. The return value from namedtuple is a class object:

    >>> Point
    <class '__main__.Point'>

    Point automatically provides methods like __init__ and __str__ so you don’t have to write them.

    To create a Point object, you use the Point class as a function:

    >>> p = Point(1, 2)
    >>> p
    Point(x=1, y=2)

    The init method assigns the arguments to attributes using the names you provided. The str method prints a representation of the Point object and its attributes.

    You can access the elements of the named tuple by name:

    >>> p.x, p.y
    (1, 2)

    But you can also treat a named tuple as a tuple:

    >>> p[0], p[1]
    (1, 2)
    >>> x, y = p
    >>> x, y
    (1, 2)

    Named tuples provide a quick way to define simple classes. The drawback is that simple classes don’t always stay simple. You might decide later that you want to add methods to a named tuple. In that case, you could define a new class that inherits from the named tuple:

    class Pointier(Point):
        # add more methods here

    Or you could switch to a conventional class definition.

    This page titled 19.8: Named tuples is shared under a CC BY-NC 3.0 license and was authored, remixed, and/or curated by Allen B. Downey (Green Tea Press) via source content that was edited to the style and standards of the LibreTexts platform; a detailed edit history is available upon request.

    • Was this article helpful?