10: Tuple, Set, Dict

10-5: keys(), values(), items()

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

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

จงเขียนฟังก์ชัน print_all_keys(d) ที่รับ d เป็นดิกในรูปแบบ {สตริง: จำนวนเต็ม} ฟังก์ชันนี้ไม่คืนอะไร แต่จะแสดงค่าคีย์ทุกตัว บรรทัดละตัว เรียงจากน้อยไปมาก

def print_all_keys(d): def print_all_keys(d): print('\n'.join(sorted(d))) q = "`" fname = "print_all_keys" func = Ex().check_function_def(fname, missing_msg="ไม่พบฟังก์ชัน " + (q+fname+q)) func.has_equal_part_len('args', 'ฟังก์ชันนี้ไม่รับพารามิเตอร์') for a in [{"D":23, "B":43, "C":2, "A":37}]: fcall = fname + "(" + str(a) + ")" func.check_call(fcall).has_equal_output(incorrect_msg = "แสดงผลผิด")
แบบฝึกหัด 10-5 ข้อที่ 2

จงเขียนฟังก์ชัน print_all_values(d) ที่รับ d เป็นดิกในรูปแบบ {สตริง: จำนวนเต็ม} ฟังก์ชันนี้ไม่คืนอะไร แต่จะแสดง value ทุกตัวใน d บรรทัดละตัว เรียงจากน้อยไปมาก

def print_all_values(d): def print_all_values(d): for v in sorted(d.values()): print(v) q = "`" fname = "print_all_values" func = Ex().check_function_def(fname, missing_msg="ไม่พบฟังก์ชัน " + (q+fname+q)) func.has_equal_part_len('args', 'ฟังก์ชันนี้ไม่รับพารามิเตอร์') for a in [{"D":37, "B":43, "C":2, "A":37}]: fcall = fname + "(" + str(a) + ")" func.check_call(fcall).has_equal_output(incorrect_msg = "แสดงผลผิด")
แบบฝึกหัด 10-5 ข้อที่ 3

จงเขียนฟังก์ชัน print_all_key_value_pairs(d) ที่รับ d เป็นดิกในรูปแบบ {จำนวนเต็ม: จำนวนเต็ม} ฟังก์ชันนี้ไม่คืนอะไร แต่จะแสดงคู่ key กับ value ทุกคู่ใน d บรรทัดละคู่ในรูปแบบ (key, value) เรียงคีย์จากน้อยไปมาก

def print_all_key_value_pairs(d): def print_all_key_value_pairs(d): for kv in sorted(d.items()): print(kv) q = "`" fname = "print_all_key_value_pairs" func = Ex().check_function_def(fname, missing_msg="ไม่พบฟังก์ชัน " + (q+fname+q)) func.has_equal_part_len('args', 'ฟังก์ชันนี้ไม่รับพารามิเตอร์') for a in [{120:37, 109:43, 200:2, 150:37}]: fcall = fname + "(" + str(a) + ")" func.check_call(fcall).has_equal_output(incorrect_msg = "แสดงผลผิด")
แบบฝึกหัด 10-5 ข้อที่ 4

จงเขียนฟังก์ชัน reverse(d) ที่รับ d เป็นดิกในรูปแบบ {ชื่อโปรแกรมเมอร์: ชื่อภาษาคอมพิวเตอร์ที่ถนัดที่สุดภาษาเดียว} ฟังก์ชันนี้จะคืนดิกที่เก็บข้อมูลกลับกันกับข้อมูลจาก d คือจะคืนดิกในรูปแบบ {ชื่อภาษาคอมพิวเตอร์: เซตของชื่อโปรแกรมเมอรที่ถนัดภาษานี้ที่สุด} เช่น reverse({"Kob":"Python", "Tom":"C", "Pear":"C"}) ได้ {"C":{"Tom","Pear"}, "Python":{"Kob"}}

def reverse(d): def reverse(d): r = {} for k,v in d.items(): if v not in r: r[v] = {k} else: r[v].add(k) return r q = "`" fname = "reverse" func = Ex().check_function_def(fname, missing_msg="ไม่พบฟังก์ชัน " + (q+fname+q)) func.has_equal_part_len('args', 'ฟังก์ชันนี้รับพารามิเตอร์ตัวเดียว') for a in [{"A":"a", "B":"b", "C":"a", "D":"b"}, {"A":"a", "B":"a", "C":"a", "D":"d"}]: fcall = fname + "(" + str(a) + ")" func.check_call(fcall).has_equal_value(incorrect_msg=(q+fcall+q) + " ให้ผลผิด")
แบบฝึกหัด 10-5 ข้อที่ 5

จงเขียนฟังก์ชัน reverse(d) ที่รับ d เป็นดิกในรูปแบบ {ชื่อโปรแกรมเมอร์: เซตของภาษาคอมพิวเตอร์ที่ถนัด} ฟังก์ชันนี้จะคืนดิกที่เก็บข้อมูลกลับกันกับข้อมูลจาก d คือจะคืนดิกในรูปแบบ {ชื่อภาษาคอมพิวเตอร์: เซตของชื่อโปรแกรมเมอรที่ถนัด} เช่น reverse({"Kob":{"C","Python"}, "Tom":{"C","Java"}, "Pear":{"C"}}) ได้ {"C":{"Kob","Tom","Pear"}, "Python":{"Kob"}, "Java":{"Tom"}}

def reverse(d): def reverse(d): r = {} for k,v in d.items(): for e in v: if e not in r: r[e] = {k} else: r[e].add(k) return r q = "`" fname = "reverse" func = Ex().check_function_def(fname, missing_msg="ไม่พบฟังก์ชัน " + (q+fname+q)) func.has_equal_part_len('args', 'ฟังก์ชันนี้รับพารามิเตอร์ตัวเดียว') for a in [{"A":{"a","b"}, "B":{"b","c"}, "C":{"c"}, "D":{"a","c"}}, {"A":{"a","b"}, "B":{"c"}, "C":{"z"}}]: fcall = fname + "(" + str(a) + ")" func.check_call(fcall).has_equal_value(incorrect_msg=(q+fcall+q) + " ให้ผลผิด")
แบบฝึกหัด 10-5 ข้อที่ 6

จงเขียนฟังก์ชัน to_set_of_tuples(d) ที่รับ d เป็นดิกในรูปแบบ {ชื่อโปรแกรมเมอร์: เซตของภาษาคอมพิวเตอร์ที่ถนัด} ฟังก์ชันนี้จะคืนเซตที่เก็บทูเปิล (ชื่อโปรแกรมเมอร์, ชื่อภาษาคอมพิวเตอร์ที่ถนัด) ที่แทนทุกคู่ที่มีในดิก d เช่น to_set_of_tuples({"Kob":{"C","Python"}, "Tom":{"C","Java"}, "Pear":{"C"}}) ได้ {("Kob,"C"), ("Kob,"Python"), ("Tom", "C"), ("Tom", "Java"), ("Pear", "C")}

def to_set_of_tuples(d): def to_set_of_tuples(d): result = set() for k,v in d.items(): for e in v: result.add((k,e)) return result q = "`" fname = "to_set_of_tuples" func = Ex().check_function_def(fname, missing_msg="ไม่พบฟังก์ชัน " + (q+fname+q)) func.has_equal_part_len('args', 'ฟังก์ชันนี้รับพารามิเตอร์ตัวเดียว') for a in [{"A":{"a","b","c"}, "B":{"b","c"}, "C":{"c"}}, {"A":{"a","b"}, "B":{"c"}, "C":{"z","x"}}]: fcall = fname + "(" + str(a) + ")" func.check_call(fcall).has_equal_value(incorrect_msg=(q+fcall+q) + " ให้ผลผิด")
แบบฝึกหัด 10-5 ข้อที่ 7

จงเขียนฟังก์ชัน average_point(point) ที่รับ point เป็นดิกในรูปแบบ {เลขประจำตัว: คะแนนรวม} ฟังก์ชันนี้จะคืนคะแนนรวมเฉลี่ยของนักเรียนทุกคน (ให้เขียนคำสั่งในฟังก์ชันนี้โดยไม่ใช้วงวนใด ๆ)

def average_point(point): def average_point(point): return sum(point.values())/len(point) q = "`" fname = "average_point" 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"(for|while)"), msg="ไม่ใช้ for หรือ while นะ") import random d1 = {e:random.randint(10,20) for e in ['s102','s103','s123','s190']} d2 = {e:random.randint(10,20) for e in 'abcdefghijklmnop'} args = [d1, d2] for a in args: fcall = fname + "(" + str(a) + ")" func.check_call(fcall).has_equal_value(incorrect_msg=(q+fcall+q) + " ให้ผลผิด")
ใช้ values ของดิก กับฟังก์ชัน len และ sum ให้เป็นประโยชน์
แบบฝึกหัด 10-5 ข้อที่ 8

จงเขียนฟังก์ชัน merge_exam(midterm, final) ที่รับ midterm และ final ทั้งคู่ เป็นดิกในรูปแบบ {เลขประจำตัว: คะแนน} ฟังก์ชันนี้จะคืนดิกใหม่ในรูปแบบเดียวกับที่รับมา แต่มีคีย์เป็นเลขประจำตัวของทั้งสองดิก ส่วนคะแนนก็ได้จากการรวมการสอบทั้งสอง ถ้ามีใครขาดสอบครั้งใดครั้งหนึ่ง ก็จะมีเฉพาะครั้งที่เข้าสอบ เช่น merge_exam({"s1":10, "s2":10}, {"s2":5, "s3":8}) จะได้ผลเป็น {"s1":10, "s2":15, "s3":8}

def merge_exam(midterm, final): def merge_exam(midterm, final): result = {} for sid in set(midterm) | set(final): result[sid] = 0 if sid in midterm: result[sid] += midterm[sid] if sid in final: result[sid] += final[sid] return result q = "`" fname = "merge_exam" func = Ex().check_function_def(fname, missing_msg="ไม่พบฟังก์ชัน " + (q+fname+q)) func.has_equal_part_len('args', 'ฟังก์ชันนี้รับพารามิเตอร์สองตัว') import random d1 = {e:random.randint(10,20) for e in 'abcde'} d2 = {e:random.randint(10,20) for e in 'cdefg'} d3 = {e:random.randint(10,20) for e in 'xy'} args = [[d1,d2], [d2,d3]] for m,f in args: fcall = fname + "(" + str(m) + "," + str(f) + ")" func.check_call(fcall).has_equal_value(incorrect_msg=(q+fcall+q) + " ให้ผลผิด")