10: Tuple, Set, Dict

10-1: Tuple

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

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

สร้าง tuple ชื่อ vowels ภายในเก็บตัวอักษรอังกฤษตัวเล็กที่เป็นสระเรียงตามพจนานุกรม

vowels = ("a", "e", "i", "o", "u") obj = Ex().check_object('vowels', missing_msg = "ไม่มีตัวแปร vowels") obj.has_equal_value(incorrect_msg = "vowels มีค่าไม่ตรงตามโจทย์") obj.has_equal_value(expr_code="type(vowels)", incorrect_msg="vowels ต้องเป็น tuple")
แบบฝึกหัด 10-1 ข้อที่ 2

อินพุตมีหลายบรรทัด (จบด้วย end) แต่ละบรรทัดมีข้อมูลชื่อรุ่นโทรศัพท์ ปีที่จำหน่าย และขนาดจอภาพ (ดังตัวอย่างในรูป) จงเขียนโปรแกรมอ่านอินพุตนี้มาสร้างเป็นลิสต์ของทูเปิลชื่อ phones แต่ละทูเปิลเก็บข้อมูลทั้งสามของโทรศัพท์ โดยเป็นลิสต์ที่เก็บข้อมูลของโทรศัพท์เรียงตามลำดับที่อ่านเข้ามา (จากอินพุตในรูป อ่านแล้วจะได้ phones = [('Nokia 9', 2019, 5.99), ('Nodia 3310', 2000, 1.5), ('Nokia N95', 2007, 2.6), ('iPhome 4', 2010, 3.5)]

___inp___ = [ "Nokia 9, 2019, 5.99", "iPhome 4, 2010, 3.5", "Nodia 3310, 2000, 1.5", "Nokia N95, 2007, 2.6", "end"] def input(): t = ___inp___.pop(0) ___inp___.append(t) return t phones = [] phones = [] x = input().strip() while x != "end": model, year, scr_size = x.split(", ") year = int(year) scr_size = float(scr_size) phones.append( (model, year, scr_size) ) x = input().strip() obj = Ex().check_object('phones', missing_msg = "ไม่มีตัวแปร phones") obj.has_equal_value(expr_code="type(phones)", incorrect_msg="phones ต้องเป็นลิสต์") obj.has_equal_value(expr_code="[type(e) for e in phones]", incorrect_msg="ภายใน phones ต้องเป็นทูเปิล") obj.has_equal_value(expr_code="[type(e) for e in phones[0]]", incorrect_msg="ประเภทของข้อมูลภายในทูเปิลต้องเป็น (str, int, float)") obj.has_equal_value(incorrect_msg = "phones มีค่าไม่ตรงตามโจทย์")
แบบฝึกหัด 10-1 ข้อที่ 3

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

___inp___ = [ "Margenta, 255, 0, 255", "Gray, 128, 128, 128", "Teal, 0, 128, 128", "Maroon, 128, 0, 0", "Navy, 0, 0, 128", "Indian red, 205, 92, 92", "Dark olive green, 85, 107, 47", "end" ] def input(): t = ___inp___.pop(0) ___inp___.append(t) return t color = {} color = {} x = input().split(", ") while len(x) > 1: cname = x[0] r = int(x[1]) g = int(x[2]) b = int(x[3]) color[(r,g,b)] = cname x = input().split(", ") obj = Ex().check_object('color', missing_msg = "ไม่มีตัวแปร phones") obj.has_equal_value(expr_code="type(color)", incorrect_msg="phones ต้องเป็น color") obj.has_equal_value(expr_code="[type(k) for k in sorted(color)]", incorrect_msg="คีย์ของ color ต้องเป็นทูเปิล") obj.has_equal_value(expr_code="[type(v) for k in sorted(color) for v in k ]", incorrect_msg="คีย์ของ color ต้องเป็นทูเปิลของจำนวนเต็ม") obj.has_equal_value(incorrect_msg = "color มีค่าไม่ตรงตามโจทย์")
แบบฝึกหัด 10-1 ข้อที่ 4

จงเขียนฟังก์ชัน top3_players(point): ที่รับดิก point ในรูปแบบ { player name: player point } ฟังก์ชันนี้คืนรายการของทูเปิลที่เก็บชื่อผู้เล่นกับคะแนน มีลำดับตามคะแนนจากมากไปน้อย 3 อันดับแรก เช่น top3_players({"Sung Hyun":8.60, "Jin-Young":9.30, "Ariya":6.16, "Minjee":6.33, "Lexi":6.71}) ได้ [("Jin-Young",9.30), ("Sung Hyun",8.6), ("Lexi",6.71)] เป็นผลลัพธ์

def top3_players(point): def top3_players(point): temp = [(point[player], player) for player in point] temp.sort() return [(player,pt) for pt,player in temp][-1:-4:-1] def is_list_of_tuple(x1, x2): return all(type(e) is tuple for e in x1) q = "`" fname = "top3_players" func = Ex().check_function_def(fname, missing_msg="ไม่พบฟังก์ชัน " + (q+fname+q)) func.has_equal_part_len('args', 'ฟังก์ชันนี้รับพารามิเตอร์ตัวเดียว') func.check_body().multi( has_code(r".*\[\s*.*\s*.*for\s*.*\s*.*\].*", not_typed_msg = "ฝึกใช้ list comprehension นะ"), #check_not( # has_code(r"for(?![^\[]*\])"), # has_code(r"while(?![^\[]*\])"), # msg = "ไม่ใช้วงวน for หรือ while" #) ) args = [{'A':10, 'B':34, 'C':21, 'D':29, 'E':9}, {'A':50, 'B':14, 'C':1, 'D':9, 'E':99}] for a in args: fcall = fname + "(" + str(a) + ")" func.check_call(fcall).has_equal_value( func=is_list_of_tuple, incorrect_msg="ต้องคืน list of tuples") func.check_call(fcall).has_equal_value(incorrect_msg=(q+fcall+q) + " ให้ผลผิด")