จงเขียนฟังก์ชัน 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 = "แสดงผลผิด")
  จงเขียนฟังก์ชัน 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 = "แสดงผลผิด")
  จงเขียนฟังก์ชัน 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 = "แสดงผลผิด")
  จงเขียนฟังก์ชัน 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) + " ให้ผลผิด")
  จงเขียนฟังก์ชัน 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) + " ให้ผลผิด")
  จงเขียนฟังก์ชัน 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) + " ให้ผลผิด")
  จงเขียนฟังก์ชัน 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) + " ให้ผลผิด")
จงเขียนฟังก์ชัน 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) + " ให้ผลผิด")