VPython Lists

From Physics Book
Revision as of 18:38, 9 April 2017 by Hray6 (talk | contribs)
Jump to navigation Jump to search

By Natalie Standish

Claimed By Harrison Ray Spring 2017

This page is to help students that are inexperienced with coding learn about the basic concepts of lists.

Lists are one of the most, if not the most, ubiquitous and powerful tools in Python. Their usefulness comes from the fact that they can be used to hold any amount of data and that data can be of any type. As such, lists are generally the go-to method for storing information.


Types of Lists

Lists of Numbers

The most basic list is one that has numbers in it. The list of numbers may contain integers, floats, or both.

Example:

numList = [1,2,3.4,5]

Lists of Strings

Lists can also be comprised of words (strings). These words must have "" surrounding them for the word to be considered a string and for the computer to accept it.

Example:

strList = ["lists", "are", "super", "cool"]

Lists of Complex Data Types

The above examples provide insight into creating lists of simple Python data types such as ints, strings, and floats. However, one of the most common uses of lists is to store more complex, custom data types. A good example of using a list in this manner in physics lab might be to store a number of spheres. A case where this may come in handy is when writing a program that models the effects of gravity on three differently sized balls. One way to initialize the three spheres is to create them individually as such:

smallBall = sphere(pos=vector(-30, 0, 0), radius=1, color=color.blue)
mediumBall = sphere(pos=vector(0, 0, 0), radius=5, color=color.red)
largeBall = sphere(pos=vector(30, 0, 0), radius=10, color=color.green)

Another method would be to use a list. Here's what that might look like:

balls = [sphere(pos=vector(-30, 0, 0), radius=1), sphere(pos=vector(0, 0, 0), radius=5), sphere(pos=vector(30, 0, 0), radius=10)]

Both examples will allow us to work with the spheres, however we gain the important advantage of being able to use a loop with the second implementation. Consider the scenario where we want to update the location of each of the three balls. If a list is not being used to store the spheres, then each of the three locations will have to be updated manually:

smallBall.pos = smallBall.pos - 2
mediumBall.pos = mediumBall.pos - 2
largeBall.pos = largeBall.pos - 2

However, by using a list to store the data, we can employ a simple for loop to update the locations:

for ball in balls:
    ball.pos = ball.pos - 2

In many cases, the programs you write in lab can have dozens of spheres. In that case, using a list to store the spheres will save you a great deal of time and effort.

Lists of Mixed Data Types

Lists don't have to be made up of the same data type.

For example, the following list made up of both strings and numbers is a valid list.

mixedList = ["twenty", 20, 5,"five"]

Lists of Lists

Lists can also contain lists within themselves. These are called nested lists.

Example:

nestedList = [1,"nest",[1,2]]

Since python does not have a matrix data structure, nested lists are commonly used to represent matrices. For example, a 3 x 3 matrix can be represented in python as a list of three elements where each of those elements is another list that corresponds to a row in the matrix.

For example, consider the following 3 x 3 matrix:

[math]\displaystyle{ \begin{bmatrix} 5 & 12 & 1 \\ 23 & 9 & 73 \\ 0 & 61 & 2 \end{bmatrix} }[/math]

We can represent the above matrix using nested lists as such:

matrix = [[5, 12, 1],[23, 9, 73],[0, 61, 2]]

Empty Lists

Empty nests are commonly used to initialize a variable and avoid program errors when calling upon that empty list. They generally have data added to them and grow throughout the program.

Example:

emptyList = []

An example of a situation in which you might initialize an empty list in Physics lab is when initializing a number of spheres and storing them in a list. By using a list and a loop, you can avoid writing an individual line of code for each sphere. Example:

spheres = []
numSpheres = 5000
for i in range(numBalls):
    spheres.append(sphere(pos=vector(i, i, i), radius=i, color=color.green))

Properties of Lists

Indices

Indexing a list is how we can identify the value at a certain spot in the list. The first component of the list is the 0th index and then it goes up by one until the last component (the nth-1 index in an list of length n). When trying to find the nth index, we use this notation: listName[n]

For example, consider the following list:

nums = [47,36,11,19]

The following commands allow us to get access to the individual list elements:

nums[0]   # returns 47 
nums[1]   # returns 36
nums[2]   # returns 11
nums[3]   # returns 19

Indexing into nested lists follows the same logic as indexing into one dimensional lists.

For example, consider the following nested list:

matrix = [[5, 12, 1],[23, 9, 73],[0, 61, 2]]

This list has three elements, each of which is another list. It follows then that:

matrix[0] returns [5, 12, 1]

To obtain an individual element in a nested list, we simply index twice:


matrix[0][0]   # returns 5
matrix[0][1]   # returns 12
matrix[0][2]   # returns 1


Appending to a List

The append function takes a previously defined/calculated value and adds it to a pre-existing list. This generally occurs in a loop and is very useful when you are trying to find patterns in the behavior of a non-static variables.

Example Code:

emptyList = []
t = 0
while t < 10:
  t = t + 1
  emptyList.append(t)
print(emptyList)              # Prints out [1,2,3,4,5,6,7,8,9,10]

Other Useful List Functions

To obtain the length of a particular list, use the len() function:

aList = [4, 5, 12]
numElements = len(aList)
print(numElements)            # Prints out 3

To obtain the sum of the elements of a list, use the sum() function:

aList = [1, 2, 3]
print(sum(aList))             # Prints out 6

A common scenario in which the above two functions are very useful is finding the average of the elements in a list:

aList = [0, 5, 15]
avg = sum(aList)/len(aList)
print(avg)                    # Prints out 20

To reverse the elements in a list, use the reverse() function:

aList = [1, 2, 3]
aList.reverse()
print(aList)                  # Prints [3, 2, 1]

Note that the reverse() function does not return a new list, instead it directly modifies the content of the list it is called on.

Sometimes you may need to remove an item from a list. Use the remove() function to do this:

aList = [7, 1, 3]
aList.remove(7)
print(aList)                  # Prints [1, 3]
print(len(aList))             # Prints 2


Relation to PHYS 2212

Imagine you are trying to detect a pattern in the speed of a moving electron in a 30 second span of time. The code you write calculates on a loop a numerical value of the speed of the electron every second. You previously defined an empty list (elecSpeed = []). The append function takes the result calculated (Let's call this x) by the program and adds it to the list that is being appended. By putting this line of code inside of the loop, your program can create a list containing 30 calculated speeds of the electron from time t = 0 to t = 29.

Example code:

elecSpeed = []
while t < 30:
    CODE THAT CALCULATES SPEED, x
    elecSpeed.append(x)

RESULTS: elecSpeed = [x(at time t=0),x(at time t=1),x(at time t=2),..........x(at time t=29)]


Further Reading

http://openbookproject.net/thinkcs/python/english3e/lists.html

References

http://openbookproject.net/thinkcs/python/english3e/lists.html