9: Nested Structure

9-4: Nested List

** ถ้าใช้งานบนมือถือหรือ tablet แนะนำให้ใช้ Chrome หรือ Safari เท่านั้น **

แบบฝึกหัด 9-4 ข้อที่ 1

จงเขียนฟังก์ชัน to_buckets(d) รับ d เป็นลิสต์ของจำนวนเต็ม ฟังก์ชันนี้คืนลิสต์ 10 ช่อง ช่องที่ k จะเก็บจำนวนเต็มใน d ที่มีหลักหน่วยเป็น k (ลำดับซ้าย/ขวาของข้อมูลในลิสต์ย่อย ให้เป็นไปตามลำดับซ้าย/ขวาใน d) เช่น to_buckets([33,21,143,33,11]) จะได้ [[], [21, 11], [], [33, 143, 33], [], [], [], [], [], []]

def to_buckets(d): def to_buckets(d): b = [] for i in range(10): b.append([]) for e in d: b[e%10].append(e) return b q = "`" fname = "to_buckets" func = Ex().check_function_def(fname, missing_msg="ไม่พบฟังก์ชัน " + (q+fname+q)) func.has_equal_part_len('args', 'ฟังก์ชันนี้รับพารามิเตอร์ตัวเดียว') import random d = [random.randint(100,999) for i in range(10)] params = ["[13,22,41,64,56,75,87,19,100,8]", d] for p in params: fcall = fname + "(" + str(p) + ")" func.check_call(fcall).has_equal_value(incorrect_msg=(q+fcall+q) + " ให้ผลผิด")
แบบฝึกหัด 9-4 ข้อที่ 2

จงเขียนฟังก์ชัน read_points() ซึ่งคืนลิสต์ของพิกัดจุดต่าง ๆ ที่อ่านได้จากอินพุต ลิสต์ที่คืนอยู่ในรูปแบบ [[x0,y0], [x1,y1], ...] ส่วนอินพุตมีบรรทัดเดียวอยู่ในรูปแบบ x0:y0, x1:y1, ... เช่น 1.0:2.4, 3:5, 6:9.0

___inp___ = ['2:3, 4.5:4.0'] def input(): t = ___inp___.pop(0) ___inp___.append(t) return t # input: 2:3, 4:4 # return: [[2.0, 3.0], [4.0, 4.0]] def read_points(): # input: 2:3, 4:4 # return: [[2.0, 3.0], [4.0, 4.0]] def read_points(): points = [] x = input().split(", ") for s in x: x,y = s.split(":") p = [float(x), float(y)] points.append(p) return points q = "`" fname = "read_points" func = Ex().check_function_def(fname, missing_msg="ไม่พบฟังก์ชัน " + (q+fname+q)) func.has_equal_part_len('args', 'ฟังก์ชันนี้ไม่รับพารามิเตอร์ใด ๆ') import random p = "" for i in range(4): x = float(random.randint(-9,9)) y = float(random.randint(-9,9)) p += str(x)+":"+str(y)+", " p = p[:-2] for v in ["2:3", p]: fcall = fname + "()" func.check_call(fcall).has_equal_value(pre_code="___inp___[0] = '" + v + "'", incorrect_msg = "ผิด กรณีอินพุตเป็น " + v)
แบบฝึกหัด 9-4 ข้อที่ 3

จงเขียนฟังก์ชัน all_closest_pairs(points) รับ points เป็นลิสต์ที่เก็บพิกัดของจุดต่าง ๆ แต่ละพิกัดเป็นลิสต์สองช่องเก็บพิกัด x และ y ฟังก์ชันนี้คืนลิสต์ของทุก ๆ คู่จุดที่อยู่ใกล้กันที่สุด (ใช้อินเด็กซ์ใน points เป็นเลขกำกับจุด) เช่น all_closest_pairs([[30,30], [30,31], [31,30], [30,32]]) ได้ [[0, 1], [0, 2], [1, 3]] (ให้สังเกตการเรียงข้อมูลในลิสต์ผลลัพธ์ คือต้องเรียงจากน้อยไปมาก)

def all_closest_pairs(points): def distance(p1, p2): dx = p1[0] - p2[0] dy = p1[1] - p2[1] return (dx**2 + dy**2)**0.5 #------------------------------------- def all_closest_pairs(points): min_distance = distance(points[0],points[1]) for i in range(len(points)): for j in range(i+1, len(points)): d = distance(points[i],points[j]) if d < min_distance: min_distance = d closest_pairs = [] for i in range(len(points)): for j in range(i+1, len(points)): d = distance(points[i],points[j]) if d == min_distance: closest_pairs.append([i,j]) return closest_pairs q = "`" fname = "all_closest_pairs" func = Ex().check_function_def(fname, missing_msg="ไม่พบฟังก์ชัน " + (q+fname+q)) func.has_equal_part_len('args', 'ฟังก์ชันนี้รับพารามิเตอร์ตัวเดียว') import random x = [random.randint(-3,3) for i in range(6)] y = [random.randint(-3,3) for i in range(6)] points = [[x[i],y[i]] for i in range(len(x))] params = ["[[10,10],[11,10],[9,10]]", str(points)] for p in params: fcall = fname + "(" + p + ")" func.check_call(fcall).has_equal_value(incorrect_msg=(q+fcall+q) + " ให้ผลผิด")
แบบฝึกหัด 9-4 ข้อที่ 4

จงเขียนฟังก์ชัน to_dict(like_list) รับลิสต์ในรูปแบบ [[u1,u2], [u3,u4], ...] ที่เก็บรายการที่ระบุว่าใครชอบใครในสื่อสังคมออนไลน์แห่งหนึ่ง สิ่งที่ฟังก์ชันนี้ต้องทำคือ สร้าง dict ในรูปแบบ {user: ลิสต์ของ users ทั้งหมดที่ user ที่เป็นคีย์ชอบ} เช่น to_dict([['A', 'B'], ['A', 'C'], ['C', 'B']]) จะได้ {'A': ['B', 'C'], 'C': ['B']}

def to_dict(like_list): def to_dict(like_list): like_dict = {} for u1,u2 in like_list: if u1 not in like_dict: like_dict[u1] = [u2] else: like_dict[u1].append(u2) return like_dict q = "`" fname = "to_dict" func = Ex().check_function_def(fname, missing_msg="ไม่พบฟังก์ชัน " + (q+fname+q)) func.has_equal_part_len('args', 'ฟังก์ชันนี้รับพารามิเตอร์ตัวเดียว') params = [[['A','B'],['A','C'],['C', 'B']], [['A','B'],['A','C'],['A','D']], [['A','Z'],['B','Z'],['C','Z']]] for p in params: fcall = fname + "(" + str(p) + ")" func.check_call(fcall).has_equal_value(incorrect_msg=(q+fcall+q) + " ให้ผลผิด")