List comprehensions
Contents
List comprehensions#
Programming for Geoscientists Data Science and Machine Learning for Geoscientists
List comprehensions are ‘shortcuts’ in creating lists using loops within one statement. The main advantage is that they are shorter to write. The syntax is:
some_list = [expression for item in iterable_object if condition]
This will generate a list with an expression based on items in ‘iterable_object’, if the condition is met. The if
condition is optional.
# List comprehensions
normal_numbers = [number for number in range(1, 20, 3)]
print(normal_numbers)
cubic_numbers = [number**3 for number in range(1, 20, 3)]
print(cubic_numbers)
# These are equivalent to
normal_numbers = []
cubic_numbers = []
for number in range(1, 20, 3):
normal_numbers.append(number)
cubic_numbers.append(number**3)
print(normal_numbers)
print(cubic_numbers)
[1, 4, 7, 10, 13, 16, 19]
[1, 64, 343, 1000, 2197, 4096, 6859]
[1, 4, 7, 10, 13, 16, 19]
[1, 64, 343, 1000, 2197, 4096, 6859]
The expression in list comprehension can be anything, the same value for each item, a string…:
zeros_list = [ 0 for i in range(5)]
text_list = ["text" for i in range(5)]
print(zeros_list)
print(text_list)
[0, 0, 0, 0, 0]
['text', 'text', 'text', 'text', 'text']
Using if
condition:
# List comprehension with if statement
# number%2 == 1 means to search for numbers whose
# remainder from division by 2 is 1 (odd numbers)
odd_numbers = [ number for number in range(20) if number%2 == 1]
print(odd_numbers)
# Equivalent to
odd_numbers = []
for number in range(20):
if number%2 == 1:
odd_numbers.append(number)
print(odd_numbers)
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
Exercises:#
Create a list comprehension to find Celsius temperatures for Fahrenheit temperatures between \(20^\circ\)F and \(80^\circ\)F at \(5^\circ\)F increments. The Fahrenheit-Celsius conversion formula is:
Answer
temp_C = [ 5./9.*(i-32) for i in range(20, 81, 5)]
print(temp_C)
Create a list of powers of two \(2^x\) where \(x\) is positive, odd, not divisible by 3 and smaller than 40. Iterate through that list and print the last integer of each element. Numbers tend to show up patterns in such analysis, can you spot one?
Answer
l = [2**x for x in range(40) if x % 2 == 1 and not(x % 3 == 0)]
for i in l:
print(i%10)