Home      |       Contents       |       About

Prev: List slicing       |       Next: List functions & methods

List of Lists

  • When the items of a list are lists themselves then we have 'list of lists'
  • Remember: a list is a heterogeneous object; it can contain lists or objects of any other type.
  • L1 is a list-of-lists; it contains three items which are simple lists of integers
In [3]:
L1 = [[1,2,3], [4], [5,6]]
print(L1)
print(L1[1])
[[1, 2, 3], [4], [5, 6]]
[4]
  • L2 offers an example of heterogeneity in lists: it has three elements:
    • a list, an integer and a string
In [4]:
L2 = [[1,20], 200, 'A']
print(L2)
print(L2[0])
[[1, 20], 200, 'A']
[1, 20]

2D Lists

  • When all items of a list are lists we can conveniently talk of 2D lists (two-dimensional lists)
    ... but remember that this is only for convenience; dimensionality is not really a property of lists
  • In the following example L1 is a square 2D list: consists of N sublists with N single elements each (in the example N=3)
In [7]:
L1 = [[1,2,3],[4,5,6],[7,8,9]]
print(L1)
print()

#printing L1 in pseudo "rows x columns" format
for row in L1:      #No index is required! 
    print(row)
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

[1, 2, 3]
[4, 5, 6]
[7, 8, 9]
  • L2 is a rectangular 2D list: contains N sublists with M single elements each (in the example N=4 ("rows-like"), M=3 ("columns-like"))
In [9]:
L2 = [[1,2,3],[4,5,6],[7,8,9],[10,11,12]]
print(L2)
print()

#printing L2 in pseudo "rows x columns" format
for row in L2:        # No index is required! 
    print(row)
[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]

[1, 2, 3]
[4, 5, 6]
[7, 8, 9]
[10, 11, 12]
  • L3 is a ragged 2D list: contains N sublists of different length each (in the example N=4)
In [20]:
L3 = [[1,2,3],[4],[7,8],[10,11,12,13,14]]
print(L3)
print()

#printing L3 in pseudo "rows x columns" format
for row in L3:        #No index is required! 
    print(row)
[[1, 2, 3], [4], [7, 8], [10, 11, 12, 13, 14]]

[1, 2, 3]
[4]
[7, 8]
[10, 11, 12, 13, 14]

Easiest way to present a list

  • The easiest way to present a list is to write a for loop with the list as iterable. Just print then the iterator: a single list item will appear in each line
In [10]:
a = [ [ 1, 2, 3 ] , [ 4, 5, 67 ] ]
for i in a:
    print(i)
[1, 2, 3]
[4, 5, 67]

Constructing 2D Lists with list comprehension

  • List comprehension is the most elegant, concize and programmatically faster way to create 2D lists
  • In case of 2D lists comprehension we will need 2 iterator variables and 2 loops (inner and outer) to describe the list values
In [11]:
alist = [[0 for i in range(5)] for k in range(3)]
alist
Out[11]:
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]

The above comprehension works as follows:

  • The inner loop '0 for i in range(5)' defines a single list object with five zeros
  • The outer loop 'for k in range(3)' defines that 3 elements are created; each one of the shape described in the inner loop
  • So we get a 3 X 5 list
In [12]:
for x in alist:
    print(x)
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
  • See some more examples
  • 4 X 2 rectangular list with '1'
In [15]:
blist = [[1 for i in range(2)] for k in range(4)]
for x in blist:
    print(x)
[1, 1]
[1, 1]
[1, 1]
[1, 1]
  • 'ragged' list with 4 elements of varied length
In [19]:
clist = [[i+1 for i in range(2)] if k%2==0 else [i+3 for i in range(3)] for k in range(4)]

for row in clist:
    print(row)
[1, 2]
[3, 4, 5]
[1, 2]
[3, 4, 5]

2D List indexing

  • Obviously you need two indexes to access a single element in a 2D list
  • In the following example:
    • index [1] refers to the second item of L2 which is the [4,5,6] list
    • double index [1][2] refers to the third item of the L1[1] list
In [21]:
L1 = [[1,2,3],[4,5,6],[7,8,9],[10,11,12]]
print(L1[1])      
print(L1[1][2])   
#print(blist[1,2])   #this syntax is not accepted for indexing 2D lists 
[4, 5, 6]
6
  • Below:
    • L2[1][2] returns the 3rd item (index 2) of the L2[1] item
    • L2[1] returns the 2nd (index 1) item of L2
    • L2[1:2] returns a slice containing only the 2nd (index 1) item of L2
In [22]:
L2 = [[1,2,3],[4,5,6],[7,8,9],[10,11,12]]
print(L2[1][2])   
print(L2[1])      
print(L2[1:2])    
6
[4, 5, 6]
[[4, 5, 6]]

3D Lists

  • We can go on and create lists of any pseudo-dimensionality we like
  • The following comprehension returns a "3D list" having as items two square 2D lists of 4X4 shape each
In [24]:
a3dlist = [[[1 if k==n else 0 for k in range(4)] for n in range(4)] for m in range(2)]

for _2d in a3dlist:
    for row in _2d:
        print(row)
    print()
[1, 0, 0, 0]
[0, 1, 0, 0]
[0, 0, 1, 0]
[0, 0, 0, 1]

[1, 0, 0, 0]
[0, 1, 0, 0]
[0, 0, 1, 0]
[0, 0, 0, 1]

  • To better understand how the comprehension works:
    • Begin from the inner loop (k iterator) that defines a 4-item list with values depending on the conditional expression: "1 if k==n else 0" ...
    • ..then move to the middle loop (n iterator) which describes 4 items of the 'inner loop shape'; so far a 2D list of 4X4 shape has been described..
    • ..and finally move to the outer loop (m iterator) which defines that two elements of 4X4 shape are constructed

Don't worry too much about high dimensinality in lists..

... when seriously working with data you are most likely to use advanced structures like 'nd-array' (in numpy package) and/or 'DataFrame' (in pandas)

. Free learning material
. See full copyright and disclaimer notice