Lists¶

In [1]:
mylist = ["one", 1  , 2 , 3] #Example of a list

Adding two lists¶

In [2]:
listone = [1,2,4]
listtwo = [2,3,4,5]

listone + listtwo
Out[2]:
[1, 2, 4, 2, 3, 4, 5]

Scalar multiplications¶

In [3]:
listone*3
Out[3]:
[1, 2, 4, 1, 2, 4, 1, 2, 4]

in and not in¶

In [4]:
mylist = [1,43,7,34,62,2,13,7435,8,9]

2 in mylist
2 not in mylist
Out[4]:
False

List comprehensions¶

Example: create a list of [1,4,9...,10000]¶

In [5]:
#for i in range(100):
  #add i**2 in a list

a = [i**2 for i in range(1,101)]
print(a)
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361, 400, 441, 484, 529, 576, 625, 676, 729, 784, 841, 900, 961, 1024, 1089, 1156, 1225, 1296, 1369, 1444, 1521, 1600, 1681, 1764, 1849, 1936, 2025, 2116, 2209, 2304, 2401, 2500, 2601, 2704, 2809, 2916, 3025, 3136, 3249, 3364, 3481, 3600, 3721, 3844, 3969, 4096, 4225, 4356, 4489, 4624, 4761, 4900, 5041, 5184, 5329, 5476, 5625, 5776, 5929, 6084, 6241, 6400, 6561, 6724, 6889, 7056, 7225, 7396, 7569, 7744, 7921, 8100, 8281, 8464, 8649, 8836, 9025, 9216, 9409, 9604, 9801, 10000]

List indexing¶

In [6]:
mylist = [0,1,2,3,4,5,6,7,8,9,10]

mylist[10]
mylist[-2]
mylist[0:4]
mylist[0::2]
mylist[0:10:2]
mylist[::-1]
Out[6]:
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

Mutability¶

In [7]:
mylist = [0,1,2,3,4,5,6]
mylist[3] = "Four"
mylist
Out[7]:
[0, 1, 2, 'Four', 4, 5, 6]

Aliasing¶

In [8]:
mylist = [0,1,2,3,4,5,6]
mylist2 = mylist
mylist[0] = "zero"
mylist2
Out[8]:
['zero', 1, 2, 3, 4, 5, 6]

Number of elements¶

In [9]:
mylist = [5,1,2,3,4,5,6,26,21,856,237,129,765,35,21]
len(mylist)
Out[9]:
15

Adding (appending) element¶

In [10]:
a = [2,5]
a.append(2)

a
Out[10]:
[2, 5, 2]

Removing elements¶

In [11]:
mylist = [1,2,3,4,5]

del mylist[0] #ตำแหน่ง
mylist
Out[11]:
[2, 3, 4, 5]
In [12]:
mylist.remove(5) #ตัวเลขที่ต้องการเอาออก
 mylist
Out[12]:
[2, 3, 4]

Tuples¶

In [13]:
my_tuple = (2,4,9) # tuple ต้องมี comma

not_a_tuple = (2) # ไม่เป็น tuple  เพราะไม่ใส่ comma

Converting between lists and tuples¶

In [14]:
mylist = [1,2,3,4,5,6]

tuple(mylist)
Out[14]:
(1, 2, 3, 4, 5, 6)
In [15]:
mytuple = (1,2,3,4,5,6)

list(mylist)
Out[15]:
[1, 2, 3, 4, 5, 6]

Tuple indexing¶

In [16]:
mytuple = (1,2,3,4,5,6,7,8,9,10)

mytuple[0:5] #เหมือน list
Out[16]:
(1, 2, 3, 4, 5)

in and not in¶

In [17]:
mytuple = (2,635,8,34,89,0,5,1346,9764,21)

2 in mytuple
100 not in mytuple
Out[17]:
True

Functions return multiple values as a tuples¶

In [18]:
def func(a,b): #a and b are floats
  x = a+b
  y = a-b

  return x,y
In [19]:
k,l = func(3,1)

print(k,l)
4 2

Dictionaries¶

สมมติว่าทางมหาวิทยาลัยวางแผนการเก็บข้อมูล รหัสนักศึกษา และ ชื่อ-นามสกุล ของนักศึกษา เราอาจจะลองเก็บข้อมูลให้อยู่ในรูปของ tuple:

student1 = (690100101 , "Peter Piper")

สามารถดึงรหัสของนักศึกษาโดยใช้ student1[0] และดึงชื่อด้วย student1[1]

student1[0]
out: 690100101
student1[1]
out: "Peter Piper"

แต่บางครั้งเราก็อยากจะดึงชื่อของนักศึกษาโดยใช้รหัสนักศึกษา ตัวอย่างเช่น

student1[690100101]
out: "Peter Piper"

เราสามารถทำได้โดยการเก็บข้อมูลไว้ใน dictionary แทน

In [20]:
students = {101 : "Peter Parker", 102 : "Mary Jane"}

dictionary ประกอบไปด้วย 2 ส่วน: key (690100101, 690100101) และ value ("Peter Piper", "Mary Jane") โดยที่การเรียก key ใน dictionary นั้น เปรียบเสมือนการไขกุญแจเพื่อเรียก value ที่มากับ key นั้น

In [21]:
students[101]
Out[21]:
'Peter Parker'

Adding/Modifying values of dict¶

In [22]:
students[103] = "Minhee"

students
Out[22]:
{101: 'Peter Parker', 102: 'Mary Jane', 103: 'Minhee'}
In [23]:
students[101] = 'Peter Pan'

students
Out[23]:
{101: 'Peter Pan', 102: 'Mary Jane', 103: 'Minhee'}

Obtain the keys, values, and key+value pairs¶

In [24]:
students.keys()

students.values()

students.items()
Out[24]:
dict_items([(101, 'Peter Pan'), (102, 'Mary Jane'), (103, 'Minhee')])

Iterations over dictionary¶

In [25]:
for key in students.values():
  print(key)
Peter Pan
Mary Jane
Minhee

A dictionary is an implementation of a hash table¶

In [26]:
import numpy as np

random_numbers = np.random.randint(low = 0, high=1_000_000, size=50_000)

random_numbers
Out[26]:
array([294927, 590534, 105146, ..., 430380, 898502,  83921])

ลองสร้าง list กับ dictionary เพื่อใช้เก็บตัวเลขใน random_number ที่ไม่ซ้ำกัน

วิธีที่ 1 ใช้ list

In [27]:
mylist = []
for num in random_numbers:
  if num not in mylist:
    mylist.append(num)

วิธีที่ 2 ใช้ dict

In [28]:
mydict = {}
for num in random_numbers:
  mydict[num] = 1
  • การหาค่าใดค่าหนึ่งใน list ที่มีสมาชิก n ตัวใช้เวลา O(n)
  • การหาค่าใดค่าหนึ่งใน key ของ dictionary ที่มี key n ตัวใช้เวลา O(1)

Exercise : เริ่มจากการ download ข้อมูล movie ratings จากเว็บไซต์ https://movielens.org/ โดยรัน code ข้างล่าง¶

In [29]:
!wget https://files.grouplens.org/datasets/movielens/ml-latest-small.zip 
!unzip ml-latest-small.zip
--2022-10-25 14:30:31--  https://files.grouplens.org/datasets/movielens/ml-latest-small.zip
Resolving files.grouplens.org (files.grouplens.org)... 128.101.65.152
Connecting to files.grouplens.org (files.grouplens.org)|128.101.65.152|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 978202 (955K) [application/zip]
Saving to: ‘ml-latest-small.zip’

ml-latest-small.zip 100%[===================>] 955.28K   512KB/s    in 1.9s    

2022-10-25 14:30:36 (512 KB/s) - ‘ml-latest-small.zip’ saved [978202/978202]

Archive:  ml-latest-small.zip
   creating: ml-latest-small/
  inflating: ml-latest-small/links.csv  
  inflating: ml-latest-small/tags.csv  
  inflating: ml-latest-small/ratings.csv  
  inflating: ml-latest-small/README.txt  
  inflating: ml-latest-small/movies.csv  
In [30]:
import pandas as pd

movies = pd.read_csv("ml-latest-small/movies.csv")
movies.head()
Out[30]:
movieId title genres
0 1 Toy Story (1995) Adventure|Animation|Children|Comedy|Fantasy
1 2 Jumanji (1995) Adventure|Children|Fantasy
2 3 Grumpier Old Men (1995) Comedy|Romance
3 4 Waiting to Exhale (1995) Comedy|Drama|Romance
4 5 Father of the Bride Part II (1995) Comedy
In [31]:
print(movies.iloc[0]['title'])
print(movies.iloc[0]['movieId'])
Toy Story (1995)
1
In [32]:
ratings = pd.read_csv("ml-latest-small/ratings.csv")
ratings.head()
Out[32]:
userId movieId rating timestamp
0 1 1 4.0 964982703
1 1 3 4.0 964981247
2 1 6 4.0 964982224
3 1 47 5.0 964983815
4 1 50 5.0 964982931

สมมติว่าเราเก็บข้อมูลเพื่อหาว่า:

ภาพยนตร์แต่ละเรื่องมีคนให้คะแนนทั้งหมดกี่คน

จงสร้างชนิดข้อมูลที่เหมาะสม (list, tuple หรือ dictionary) เพื่อที่จะตอบคำถามข้างบนได้อย่างรวดเร็ว หลังจากนั้นจงบอกว่าในภาพยนตร์แต่ละเรื่องข้างล่างนี้มีผู้ให้คะแนนทั้งหมดกี่คน

  1. Toy Story (1995)
  2. Speed (1994)
  3. Ocean's Eleven (2001)
In [33]:
a = movies[movies['title']=='Toy Story (1995)']
a
Out[33]:
movieId title genres
0 1 Toy Story (1995) Adventure|Animation|Children|Comedy|Fantasy
In [34]:
b = movies[movies['title']=='Speed (1994)']
b
Out[34]:
movieId title genres
334 377 Speed (1994) Action|Romance|Thriller
In [35]:
c = movies[movies['title']=="Ocean's Eleven (2001)"]
c
Out[35]:
movieId title genres
3614 4963 Ocean's Eleven (2001) Crime|Thriller
In [36]:
toy = ratings[ratings['movieId'] == 1]
toy[['userId']].shape
Out[36]:
(215, 1)

มีจำนวนคนที่ดูภาพยนตร์ Toy Story (1995) ทั้งหมด 215 คน

In [37]:
speed = ratings[ratings['movieId'] == 334]
speed[['userId']].shape
Out[37]:
(5, 1)

มีจำนวนคนที่ดูภาพยนตร์ Speed (1994) ทั้งหมด 5 คน

In [38]:
ocean = ratings[ratings['movieId'] == 3614]
ocean[['userId']].shape
Out[38]:
(8, 1)

มีจำนวนคนที่ดูภาพยนตร์ Ocean's Eleven (2001) ทั้งหมด 8 คน

In [39]:
print(pd.concat([ocean[['userId']],speed[['userId']],toy[['userId']]]))
       userId
7655       51
8484       57
42802     288
44374     294
63459     414
...       ...
97364     606
98479     607
98666     608
99497     609
99534     610

[228 rows x 1 columns]
In [40]:
(pd.concat([ocean[['userId']],speed[['userId']],toy[['userId']]])).shape
Out[40]:
(228, 1)

มีจำนวนคนที่ดูภาพยนต์ทั้ง 3 เรื่องทั้งหมด 228 คน