Lists and Tuples

Skip Montanaro skip at pobox.com
Fri Dec 5 18:10:34 CET 2003


(Probably more response than you wanted.  I kind of got carried away...)

    >> I've spent most of the day playing around with lists and tuples to
    >> get a really good grasp on what you can do with them. I am still left
    >> with a question and that is, when should you choose a list or a
    >> tuple?

Generally, choose between tuples and lists based upon your data.  In
situations where you have a small, fixed collection of objects of possibly
differing types, use a tuple.  In situations where have a collection of
objects of uniform type which might grow or shrink, use a list.  For
example, an address might best be represented as a tuple:

    itcs = ("2020 Ridge Avenue", "Evanston", "IL", "60201")
    caffe_lena = ("47 Phila Street", "Saratoga Springs", "NY", "12866")

Though all elements are actually strings, they are conceptually different
types.  It probably makes no sense to define itcs as

    itcs = ("2020 Ridge Avenue", "60201", "IL", "Evanston")

If you are reading test scores from a file, you'd likely accumulate them
into a list:

    scores = []
    for line in file("foo"):
        scores.append(float(line.strip()))

then operate on them as a group, possibly normalized to the list's length:

    nscores = len(scores)
    mean = sum(scores)/nscores
    variance = sum([(n-mean)**2 for n in scores])/nscores
    print "Mean:", mean
    print "Variance:", variance

Unlike tuples, it's often perfectly reasonable to reorder lists without any
loss of meaning:

    scores.sort()
    print "Min:", scores[0]
    print "Max:", scores[-1]
    print "Median:", scores[nscores/2:nscores/2+1]

Think of lists as arrays and tuples as Pascal records or C structs and
you'll probably choose correctly most of the time.

If you want to associate methods with your tuples (similarly for lists), you
should probably define a class instead:

    import latlong

    class Address:
        def __init__(self, street, city, state, zip):
            self.street = street
            self.city = city
            self.state = state
            self.zip = zip

        def distance(self, other):
            return latlong.cdistance("%s, %s" % (self.city, self.state),
                                     "%s, %s" % (other.city, other.state))

    itcs = Address("2020 Ridge Avenue", "Evanston", "IL", "60201")
    caffe_lena = Address("47 Phila Street", "Saratoga Springs", "NY", "12866")
    print itcs.distance(caffe_lena), "miles"

For the curious, when run, the above prints:

    961.976657911 miles

Looks like I won't be attending a concert at Caffe Lena tonight.

(latlong is a module I wrote for use in the Mojam and Musi-Cal websites but
never released publically.)

Skip






More information about the Python-list mailing list