Python list comprehensions

What do you think this will do?

>>> text= """Pierre Vinken, 61 years old, will join the board as a nonexecutive director Nov. 29."""

>>> words = text.split()

>>> [w.lower() for w in words]

It gives you a list, which contains a lowercased word for each item in the list 'words':

>>> [ w.lower() for w in words ]

['pierre', 'vinken,', '61', 'years', 'old,', 'will', 'join', 'the', 'board', 'as', 'a', 'nonexecutive', 'director', 'nov.', '29.']

You can use a list comprehension to transform each item on a list

Try it for yourself: Write a function that takes as input a list of strings and returns a list of the same strings, but with one space before and one space after each string:

>>> surround_by_space([“a”, “b”, “c”])

[“ a “, “ b “, “ c “]

Here is the solution:

def surround_by_space(stringlist):

    return [ “ “ + w + “ “ for w in stringlist ]

Addressing punctuation, again

Previously, we have only considered fullstop and comma. But there are more punctuation symbols. Python actually has a pre-defined string containing punctuation symbols:

>>> import string

>>> string.punctuation

'!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~’

Consider again the Python string function rstrip():

>>> "    hello   ".rstrip()

'    hello’

>>> "hello!?!".rstrip("!?")

'hello’

If given no further argument, it removes all whitespace on the end of a string. if given an argument, for example "!?", it will remove all "!" and "?" at the end of the string.

Putting things together: We will use list comprehensions, string.punctuation, and rstrip() to remove punctuation.

def remove_punct(text):

     words = text.split()

     return [w.rstrip( string.punctuation) for w in words ]

Here's what this will do:

>>> text = """For a minute he scarcely realised what this meant, and, although the heat was excessive, he clambered down into the pit close to the bulk to see the Thing more clearly. """

>>> remove_punct(text)

['For', 'a', 'minute', 'he', 'scarcely', 'realised', 'what', 'this', 'meant', 'and', 'although', 'the', 'heat', 'was', 'excessive', 'he', 'clambered', 'down', 'into', 'the', 'pit', 'close', 'to', 'the', 'bulk', 'to', 'see', 'the', 'Thing', 'more', 'clearly']

More uses of list comprehensions

What do you think this will do?

>>> mylist = ['for', 'a', 'minute', 'he', 'scarcely', 'realised', 'what', 'this', 'meant', 'and', 'although', 'the', 'heat', 'was', 'excessive', 'he', 'clambered', 'down', 'into', 'the', 'pit', 'close', 'to', 'the', 'bulk', 'to', 'see', 'the', 'thing', 'more', 'clearly']

>>> mystopwords = ["the", "a", "to", "for", "he", "she", "it", "what", "and"]

>>> [ w for w in mylist if w not in mystopwords]

It only retains the members of mylist that are not stopwords. So you can use list comprehensions to filter lists:

>>> mylist = ['for', 'a', 'minute', 'he', 'scarcely', 'realised', 'what', 'this', 'meant', 'and', 'although', 'the', 'heat', 'was', 'excessive', 'he', 'clambered', 'down', 'into', 'the', 'pit', 'close', 'to', 'the', 'bulk', 'to', 'see', 'the', 'thing', 'more', 'clearly']

>>> mystopwords = ["the", "a", "to", "for", "he", "she", "it", "what", "and"]

>>> [ w for w in mylist if w not in mystopwords]

 ['minute', 'scarcely', 'realised', 'this', 'meant', 'although', 'heat', 'was', 'excessive', 'clambered', 'down', 'into', 'pit', 'close', 'bulk', 'see', 'thing', 'more', 'clearly']

So we have seen uses of list comprehensions that transform each item on the list, and uses that filter a list. You can do both at the same time. Here's an example task:

Given a list of numbers,

First we need to figure out how to test whether a number is even. We will use the operator "%". Try the following expressions to figure out what it does:

>>> 5 % 3

>>> 19 % 5

>>> 3 % 2

It gives you the "modulo". When you divide 5 by 3, the remainder is 2, so 5 % 3 = 2. When you divide 19 by 5, the remainder is 4, so 19 % 5 = 4. How can we use this to test whether a number is even or odd?

>>> 4 % 2

0

>>> 3 % 2

1

An even number modulo 2 is zero, an odd number modulo 2 is 1. Putting things together:

def drop_even_square_odd(intlist):

    return [i * i for i in intlist if i % 2 != 0]

>>> drop_even_square_odd([5,2018, 2, 9])

[25, 81]

Next, we will make a function that takes an integer as input and returns a list of its digits. So we want

>>> extract_digits(1234)

[1, 2, 3, 4]

We will proceed as follows: Given a number myint,

Here is how to break a string up into characters:

>>> list("hippopotamus")

['h', 'i', 'p', 'p', 'o', 'p', 'o', 't', 'a', 'm', 'u', 's']

So if you convert a string to a list, what you get is a list of the letters of the string.

Putting things together:

def extract_digits(myint):

    mystr = str(myint)

    digit_string_list = list(mystr)

    return [ int(s) for s in digit_string_list ]