Lab 6 Data Analysis
要点: – csv文件操作: 使用csv库加载csv文件
import csv
with open(“filename.csv”) as csvfile:
reader = csv.reader(csvfile)
table = [ row for row in reader]
“””
table = []
for row in reader:
table.append(row)
“””
– List comprehension: 构造一个list, 也可以用于构造字典
table_non_empty_col3 = [ row for row in table if row[3] != ” ]
dict_ab = {a:b for a, b in zip(list_a, list_b)}
– Numpy的用法: 不是重点, 最后再看, 会用np.array,做元素的访问,基本运算就好。
– Visualising data: 不是重点, 最后再看。 如果用到某个特殊的API,会在考试中有接口说明的。
– Weather data: 这里考验的都是如何查找出指定的信息, 或者统计某些信息。 不涉及复杂的算法, 使用for循环, 或者直接使用数据结构本身的查找函数就可以。比如找到某几个月份的对应的信息, 找到最冷的一天, 计算平均气温, 计算冬天持续的长度。
– House market data: 与Weather data做的事情是类似的。 用一个for循环基本都可以搞定, 只是要获取的信息不同。比如数据的范围,最新的,最旧的销售记录。
– 计算中位数:
def median(list_a):
list_len = len(list_a)
if list_len == 0:
return None
sorted_list = sorted(list_a)
if list_len % 2 == 0:
return (sorted_list[list_len/2] + sorted_list[list_len/2 – 1])/2
else:
return sorted_list[list_len//2]
Lab 7 Mutable types and References, Scope and Namespaces
要点:
– immutable VS. mutable: 只能访问, 不能修改的, 就是immutable. 比如 string, tuple.
– Reference: 引用。 一个python里面的变量有两部分, ID和具体的内容。 如果具体的内容存放的是一个ID, 那么这就是一个reference。深刻理解: 赋值和引用。
– 变量给变量赋值。
– 浅拷贝(copy)。
– 深拷贝(deep copy)。
import copy
list_a = [5, 6, 7]
list_b = [1, list_a, 3]
# 1
list_c = list_b
list_b[0] = 0
list_b[1][1] = 0
print (list_c)
# 2 copy
list_c = copy.copy(list_b)
list_b[0] = 0
list_b[1][1] = 0
print (list_c)
# 3 deep copy
list_c = copy.deepcopy(list_b)
list_b[0] = 0
list_b[1][1] = 0
print (list_c)
– 使用id()查看一个变量的ID(地址)
– 仔细阅读Exercise 2中的Function1 和Function2, 用于了解一些新的用法。
– Namespaces 命名空间: 用来限制变量的使用范围。防止重名的变量覆盖/引用彼此。 使用python代码可视化工具帮助自己理解这个概念。
– global关键字的使用。
– local assignment rule。 否则要显式地声明使用了全局变量(global关键字)
– Recursion: 函数自己调用自己, 但是每次调用都会开启一个local environment. 体会Exercise 4的find_max(seq)函数。
– 正确版:
def find_max(seq, i):
if i == len(seq) – 1:
return seq[i]
else:
first = seq[i]
i = i + 1
max_of_rest = find_max(seq, i)
return max(first, max_of_rest)
– List 常用的操作
list_a = [0, 1, 2, 3, 4]
# list_a = range(5) # 与上面等价的
# list_a.append(x) 在list末尾追加x
# list_a.insert(1, x) 在index = 1的位置处插入x。
# list_a.extend(list_b) 将list_b所有元素追加到list_a后面
# 使用help(list.append) 等查看对应的功能描述(insert, extend)。
– List shuffle:
– a. perfect shuffle, 切成均匀的两段(len(list_a)/2), 穿插两段组成新的数组。
– b. 同样是perfect shuffle, 内置shuffle, 直接修改原来的数组。 “`python def perfect_shuffle_in_place(input_list): list_len = len(input_list) if list_len <= 3: return THE FIRST AND LAST ITEM ARE ALWAYS IN THE SAME POSITION. SO IGNORE THEM first_half_start_index = 1 if list_len%2 == 0: half_len = (list_len/2)-1 second_half_start_index = (list_len/2) else: half_len = (list_len/2) second_half_start_index = (list_len/2)+1 while half_len > 0:
for i in range(half_len):
first_half_index = first_half_start_index + i
second_half_index = second_half_start_index + i
tmp_value = input_list[first_half_index]
input_list[first_half_index] = input_list[second_half_index]
input_list[second_half_index] = tmp_value
half_len -= 1
first_half_start_index += 1
#my_list = [1, 2, 3, 4, 5] my_list = [1, 2, 3, 4, 5, 6] #my_list = [1, 2, 3, 4, 5, 6, 7] perfect_shuffle_in_place(my_list) print (my_list) – Nested shuffle: 如何判定嵌套的层数:python def count_nest_depth(input_list): depth = 0 iter_list = input_list
while len(iter_list) > 0:
new_iter_list = []
for item in iter_list:
# 判断是否是一个list类型, 是的话进行合并,不是的话忽略。
if isinstance(item, list):
# 利用extend能力, 将同一层的item合并成一个list
new_iter_list.extend(item)
if len(new_iter_list) > 0:
depth += 1
iter_list = new_iter_list
return depth
test = [[1,2], [2,4]] #test = [1, [2], [[3], [[4], 5]]] print (‘total depth:’, count_nest_depth(test)) “` – Numpy部分: 不是重点, 最后看。 – a, 从i=1开始检查, 遍历对角线周围的元素, 直到i增大到某个值,违反了diagonality, 返回最大的值为i-1.
Lab 8 Working with files
要点: – 文件系统的操作: os module的使用 python os.getcwd() #获取当前目录 os.chdir(‘/xx/ddd/path’) # 切换目录 – Reverse file “`python def reverse_file(path_str, output_path_str): lines = [] with open(path_str, ‘r’) as f: while new_line = f.readline(): lines.append(new_line) # method 1 #for i in range(len(lines)-1, -1, -1): # print (lines[i])
# method 2
lines.reverse()
for line in lines:
print (line)
– Recursive file listing. (主要理解什么是recursive)python import os
def recursive_file_listing(current_dir): file_list = [] for path_str in os.listdir(current_dir): full_path = os.path.join(current_dir, path_str) if os.path.isfile(full_path): #file_list.append(full_path) file_list.append(path_str)
if os.path.isdir(full_path):
file_list.extend(recursive_file_listing(full_path))
return file_list
test_dir = ‘./ML-Tutorial-Experiment’ print (recursive_file_listing(test_dir)) “` – 其他的读写文件了解就好, 可以把API放到cheatsheet中