8: Basic Dict

8-2: Modifying Dict Content

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

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

จงสร้างตัวแปรชื่อ count_alpha เป็นดิกที่มี key เป็นตัวอักษรอังกฤษทั้งใหญ่และเล็กทุกตัวอักษร ส่วน value ให้เป็น 0 หมด

count_alpha = {} alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" alpha += alpha.lower() for c in alpha: count_alpha[c] = 0 var = "count_alpha" obj = Ex().check_object(var, missing_msg = "ไม่พบตัวแปร " + var) obj.has_equal_value(expr_code="type("+var+")", incorrect_msg=var + " ต้องเป็น dict") obj.has_equal_value(expr_code="len("+var+")", incorrect_msg = "ยังขาดบางตัวอักษร") obj.has_equal_value(incorrect_msg = "ยังตั้งค่าในดิกไม่ถูกต้อง")
แบบฝึกหัด 8-2 ข้อที่ 2

มีดิกชื่อ number_of_students อยู่แล้วตัวหนึ่ง จัดเก็บข้อมูลในรูปแบบ {รหัสวิชา: จำนวนนิสิตที่ลงทะเบียน} โดยรหัสวิชาเป็นสตริง จงเขียนคำสั่งเพิ่มจำนวนนิสิตที่ลงทะเบียนให้กับวิชา 2110101 อีก 28 คน และตั้งให้วิชา 2301107 มีนิสิตลงทะเบียน 824 คน

number_of_students = {"2110101": 440, "2110183": 7, "2110211": 120} number_of_students["2110101"] += 28 number_of_students["2301107"] = 824 var = "number_of_students" obj = Ex().check_object(var, missing_msg = "ไม่พบตัวแปร " + var) obj.has_equal_value(expr_code="type("+var+")", incorrect_msg=var + " ต้องเป็น dict") obj.has_equal_value(incorrect_msg = "ยังตั้งค่าในดิกไม่ถูกต้อง")
แบบฝึกหัด 8-2 ข้อที่ 3

โปรแกรมนี้มีตัวแปร student1 เป็นดิกเก็บรายละเอียดของนักเรียนคนหนึ่ง จงเขียนฟังก์ชัน read_data() มีหน้าที่อ่านข้อมูลจากอินพุตประกอบด้วย เลขประจำตัว, ชื่อ-สกุล, วัน, เดือน, ปีเกิด (คั่นด้วย comma และช่องว่าง) มาเก็บในดิกที่มีรูปแบบเดียวกับ student1 แล้วคืนเป็นผลของฟังก์ชัน เช่น อินพุตเป็น 4230000021, Natalie P., 9, 6, 1981 จะได้ผลจาก read_data เป็น {"ID": "4230000021", "Name": "Natalie P.", "Birthdate": [9, 6, 1981]}

___inp___ = ["12345, George L., 14, 5, 1944"] def input(): t = ___inp___.pop(0) ___inp___.append(t) return t def read_data(): x = input().split(", ") ??? student1 = {"ID": "5830000021", "Name": "Pranpriya M.", "Birthdate": [27, 3, 1997]} def read_data(): x = input().split(", ") r = {} r["ID"] = x[0] r["Name"] = x[1] r["Birthdate"] = [int(x[2]), int(x[3]), int(x[4])] return r q = "`" fname = "read_data" func = Ex().check_function_def(fname, missing_msg="ไม่พบฟังก์ชัน " + (q+fname+q)) func.has_equal_part_len('args', 'ฟังก์ชันนี้ไม่รับพารามิเตอร์ใด ๆ') fcall = fname + "()" func.check_call(fcall).has_equal_value(incorrect_msg=(q+fcall+q) + " ให้ผลผิด")
แบบฝึกหัด 8-2 ข้อที่ 4

จงเขียนโปรแกรมอ่านจากอินพุตบรรทัดเดียวเป็นรายการของชื่อย่อจังหวัด อังกฤษกับไทย คั่นด้วยช่องว่าง เช่น BKK กทม CMI ชม เพื่อนำมาสร้างเป็นดิกชื่อ abbr = {"BKK": "กทม", "CMI": "ชม", "กทม": "BKK" ,"ชม": "CMI"}

___inp___ = ["CBI ชบ BKK กทม CMI ชม KBI กบ KNN ขก"] def input(): t = ___inp___.pop(0) ___inp___.append(t) return t x = input().split() abbr = {} for i in range(0,len(x),2): abbr[x[i]] = x[i+1] abbr[x[i+1]] = x[i] var = "abbr" obj = Ex().check_object(var, missing_msg = "ไม่พบตัวแปร " + var) obj.has_equal_value(expr_code="type("+var+")", incorrect_msg=var + " ต้องเป็น dict") obj.has_equal_value(incorrect_msg = "ยังตั้งค่าในดิกไม่ถูกต้อง")
แบบฝึกหัด 8-2 ข้อที่ 5

จงเขียนฟังก์ชัน add(points, members, extra) รับดิก points ที่เก็บข้อมูลในรูปแบบ {รหัสสมาชิก: จำนวนแต้มสะสม}, members เป็นลิสต์เก็บรหัสสมาชิก กับ extra เป็นจำนวนแต้ม ฟังก์ชันนี้จะเพิ่มแต้มเป็นจำนวน extra ในดิก points ให้กับสมาชิกที่มีรหัสปรากฏใน members ฟังก์ชันนี้ไม่คืนอะไรเลย เพราะจะปรับข้อมูลใน points

def add(points, members, extra): for m in members: points[m] += extra q = "`" fname = "add" func = Ex().check_function_def(fname, missing_msg="ไม่พบฟังก์ชัน " + (q+fname+q)) func.has_equal_part_len('args', 'ฟังก์ชันนี้รับพารามิเตอร์สามตัว') func.check_body().check_not(has_code(r"points\s*\="), msg="ไม่ควรมีคำสั่ง points = เพื่อเปลี่ยนค่าใน points") func.check_call("add({},{},0)").has_equal_value(incorrect_msg="ฟังก์ชันนี้ต้องไม่คืนอะไรเลย") pt = {"01":10, "02":20, "03":30, "04":40} mb = ["02", "01"] ex = 5 func.check_body().set_context(pt, mb, ex).has_equal_value(name = "points", incorrect_msg = "ปรับแต้มใน points ไม่ถูกต้อง อ่านโจทย์อีกครั้ง")
ใช้วงวน for ลุยหยิบสมาชิกใน members เป็นคีย์เพื่อปรับค่าใน points
แบบฝึกหัด 8-2 ข้อที่ 6

บรรทัดแรกของอินพุตคือรายการของรหัสสินค้า ตามด้วยบรรทัดต่อ ๆ ไปจนถึง end คือรายการการประมูลสินค้า แต่ละบรรทัดประกอบด้วย รหัสผู้ประมูล รหัสสินค้า ราคาประมูล เราต้องการสร้างดิกชื่อ bid = {รหัสสินค้า: [รหัสผู้ประมูลสูงสุด, ราคาประมูลสูงสุด]} คือ มีรหัสสินค้าเป็นคีย์ ส่วนค่าเป็นลิสต์สองช่องเก็บรหัสผู้ประมูลกับราคาประมูลสูงสุด จากตัวอย่างอินพุต จะได้ bid = {'P001': ['U102', 120], 'P002': ['U101', 150], 'P102': ["", 0]}
โปรแกรมนี้มีคำสั่งอ่านรหัสสินค้าทั้งหมดมาสร้างดิก bid ที่มีทุกค่าเป็น ["", 0] คือยังไม่มีใครประมูลเลย จงเขียนคำสั่งอ่านข้อมูลการประมูลเพื่อสร้าง bid ให้ได้ตามที่ต้องการ

___inp___ = ["P101 P102 P103", "U101 P101 100", "U101 P102 100", "U102 P101 100", "U102 P102 200", "U102 P101 110", "U101 P101 120", "end"] def input(): t = ___inp___.pop(0) ___inp___.append(t) return t prods = input().split() bid = {} for p in prods: bid[p] = ["", 0] x = input().split() while x[0] != "end": x = input().split() prods = input().split() bid = {} for p in prods: bid[p] = ["", 0] x = input().split() while x[0] != "end": user = x[0] prod = x[1] price = int(x[2]) if price > bid[prod][1]: bid[prod] = [user, price] x = input().split() var = "bid" obj = Ex().check_object(var, missing_msg = "ไม่พบตัวแปร " + var) obj.has_equal_value(expr_code="type("+var+")", incorrect_msg=var + " ต้องเป็น dict") obj.has_equal_value(incorrect_msg = "ยังตั้งค่าในดิกไม่ถูกต้อง")
ถ้าราคาประมูลใหม่มากกว่าที่เก็บไว้ ก็เปลี่ยนค่า value