10: Tuple, Set, Dict

10-2: Set Method

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

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

สร้าง set ชื่อ 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 ต้องเป็น set")
แบบฝึกหัด 10-2 ข้อที่ 2

อินพุตมีสองบรรทัด แต่ละบรรทัดเป็นรายการของจำนวนเต็ม (คั่นด้วยช่องว่าง) จงสร้างเซตชื่อ s เก็บจำนวนที่ปรากฏทั้งในบรรทัดแรก และ/หรือบรรทัดที่สอง

___inp___ = ["1 2 3 4 5", "0 3 4 1 6 9 10"] def input(): t = ___inp___.pop(0) ___inp___.append(t) return t x1 = [int(e) for e in input().split()] x2 = [int(e) for e in input().split()] s1 = set([int(e) for e in input().split()]) s2 = set([int(e) for e in input().split()]) s = s1 | s2 obj = Ex().check_object('s', missing_msg = "ไม่มีตัวแปร `s`") obj.multi( has_equal_value(expr_code = "type(next(iter(s)))", incorrect_msg = "`s` เป็นเซตของจำนวนเต็ม"), has_equal_value(incorrect_msg = "`s` มีค่าไม่ตรงตามโจทย์") )
คิดถึง union หรือ |
แบบฝึกหัด 10-2 ข้อที่ 3

อินพุตมีสองบรรทัด แต่ละบรรทัดเป็นรายการของจำนวนเต็ม (คั่นด้วยช่องว่าง) จงสร้างเซตชื่อ s เก็บจำนวนที่ปรากฏทั้งในบรรทัดแรกและบรรทัดที่สองเท่านั้น

___inp___ = ["1 2 3 4 5", "0 3 4 1 6 9 10"] def input(): t = ___inp___.pop(0) ___inp___.append(t) return t s1 = set([int(e) for e in input().split()]) s2 = set([int(e) for e in input().split()]) s = s1 & s2 obj = Ex().check_object('s', missing_msg = "ไม่มีตัวแปร `s`") obj.multi( has_equal_value(expr_code = "type(next(iter(s)))", incorrect_msg = "`s` เป็นเซตของจำนวนเต็ม"), has_equal_value(incorrect_msg = "`s` มีค่าไม่ตรงตามโจทย์") )
คิดถึง intersection หรือ &
แบบฝึกหัด 10-2 ข้อที่ 4

อินพุตมีสองบรรทัด แต่ละบรรทัดเป็นรายการของจำนวนเต็ม (คั่นด้วยช่องว่าง) จงสร้างเซตชื่อ s เก็บจำนวนที่ปรากฏเฉพาะในบรรทัดแรก แต่ไม่มีในบรรทัดที่สอง

___inp___ = ["1 2 3 4 5", "0 3 4 1 6 9 10"] def input(): t = ___inp___.pop(0) ___inp___.append(t) return t s1 = set([int(e) for e in input().split()]) s2 = set([int(e) for e in input().split()]) s = s1 - s2 obj = Ex().check_object('s', missing_msg = "ไม่มีตัวแปร `s`") obj.multi( has_equal_value(expr_code = "type(next(iter(s)))", incorrect_msg = "`s` เป็นเซตของจำนวนเต็ม"), has_equal_value(incorrect_msg = "`s` มีค่าไม่ตรงตามโจทย์") )
คิดถึง difference หรือ -
แบบฝึกหัด 10-2 ข้อที่ 5

อินพุตมีสองบรรทัด แต่ละบรรทัดเป็นรายการของจำนวนเต็ม (คั่นด้วยช่องว่าง) จงสร้างเซตชื่อ s เก็บจำนวนที่ปรากฏเฉพาะในบรรทัดแรก และจำนวนที่ปรากฏเฉพาะในบรรทัดที่สอง

___inp___ = ["1 2 3 4 5", "0 3 4 1 6 9 10"] def input(): t = ___inp___.pop(0) ___inp___.append(t) return t s1 = set([int(e) for e in input().split()]) s2 = set([int(e) for e in input().split()]) s = s1 ^ s2 obj = Ex().check_object('s', missing_msg = "ไม่มีตัวแปร `s`") obj.multi( has_equal_value(expr_code = "type(next(iter(s)))", incorrect_msg = "`s` เป็นเซตของจำนวนเต็ม"), has_equal_value(incorrect_msg = "`s` มีค่าไม่ตรงตามโจทย์") )
คิดถึง symmetric_difference หรือ ^
แบบฝึกหัด 10-2 ข้อที่ 6

อินพุตมีสองบรรทัด แต่ละบรรทัดเป็นรายการของจำนวนเต็ม (คั่นด้วยช่องว่าง) จงแสดง True ถ้าจำนวนในบรรทัดแรกทุกตัวปรากฎในบรรทัดสอง ไม่เช่นนั้นแสดง False

___inp___ = ["1 2 3 4 5", "0 3 4 1 6 9 10"] def input(): t = ___inp___.pop(0) ___inp___.append(t) return t s1 = set([int(e) for e in input().split()]) s2 = set([int(e) for e in input().split()]) print(s1 <= s2) for v in [["1 2 3 4 5", "0 3 4 1 6 9 10"], ["04 05 03", "1 4 5 2 3"], ["4 5 3", "3 5 4"]]: Ex().has_equal_output(pre_code = "___inp___[:] =" + str(v), incorrect_msg = "แสดงผลไม่ถูกต้อง กรณีอินพุตเป็น "+" กับ ".join(v))
คิดถึง issubset หรือ <=
แบบฝึกหัด 10-2 ข้อที่ 7

อินพุตมีสองบรรทัด แต่ละบรรทัดเป็นรายการของจำนวนเต็ม (คั่นด้วยช่องว่าง) จงแสดง True ถ้าไม่มีจำนวนใดในบรรทัดแรก ปรากฏในบรรทัดที่สองเลย ไม่เช่นนั้นแสดง False

___inp___ = ["1 2 3 4 5", "0 3 4 1 6 9 10"] def input(): t = ___inp___.pop(0) ___inp___.append(t) return t s1 = set([int(e) for e in input().split()]) s2 = set([int(e) for e in input().split()]) print(len(s1 & s2) == 0) for v in [["1 2 3 4 5", "9 8 7 6"], ["04 5 3", "4 9 11"], ["4 5 3", "3 5 4"]]: Ex().has_equal_output(pre_code = "___inp___[:] =" + str(v), incorrect_msg = "แสดงผลไม่ถูกต้อง กรณีอินพุตเป็น "+" กับ ".join(v))
คิดถึง intersection หรือ จะใช้ isdisjoint
แบบฝึกหัด 10-2 ข้อที่ 8

จงเขียนฟังก์ชัน goo(x) ที่รับลิสต์ x แล้วคืนลิสต์ที่มีข้อมูลเหมือน x แต่ไม่มีตัวซ้ำ และเรียงลำดับข้อมูลจากน้อยไปมาก เช่น goo([1,1,5,5,5,3,2,0,0]) จะได้ [0, 1, 2, 3, 5]

def goo(x): def goo(x): return sorted(set(x)) q = "`" fname = "goo" func = Ex().check_function_def(fname, missing_msg="ไม่พบฟังก์ชัน " + (q+fname+q)) func.has_equal_part_len('args', 'ฟังก์ชันนี้รับพารามิเตอร์ตัวเดียว') func.check_body().check_function("sorted", missing_msg="หัดใช้ฟังก์ชัน sorted ในข้อนี้") import random x = [random.randint(0,5) for e in range(15)] for a in [[1,2,2,3,3], x]: fcall = fname + "(" + str(a) + ")" func.check_call(fcall).has_equal_value(incorrect_msg=(q+fcall+q) + " ให้ผลผิด")
นำลิสต์ที่ได้ไปสร้างเซต แล้วส่งให้ sorted เรียงลำดับ ได้ลิสต์คืนเป็นผลลัพธ์ ทำทั้งหมดในบรรทีดเดียว
แบบฝึกหัด 10-2 ข้อที่ 9

อินพุตประกอบด้วยหลายบรรทัด (บรรทัดแรกเป็นจำนวนเต็ม k ตามด้วยอีก k บรรทัด) แต่ละบรรทัดเป็นรหัสคูปอง จงเขียนโปรแกรมอ่านรหัสคูปองมาเก็บ โดยระบบจะอนุญาตให้เก็บคูปองในแต่ละรหัสได้แค่ใบเดียว (แต่ในอินพุตอาจมีรหัสซ้ำหลายใบก็ได้) หลังจากอ่านจนครบ ให้แสดงรหัสคูปองทั้งหมด บรรทัดละใบเรียงตามรหัสจากน้อยไปมาก

___inp___ = ["7", " CODE-10%", "AUG88-80", " CODE-5%", "CODE-10%", "CODE-5%", "KERRY-FREE"," KERRY-FREE"] def input(): t = ___inp___.pop(0) ___inp___.append(t) return t coupons = set() k = int(input()) for k in range(k): c = input().strip() coupons.add(c) for c in sorted(coupons): print(c) for v in [["3", "A", "A", "A"], ["5", " Z", "B", " B", "Z ", "C"]]: Ex().has_equal_output(pre_code = "___inp___[:] =" + str(v), incorrect_msg = "แสดงผลไม่ถูกต้อง (อย่าลืม strip สตริงที่อ่านเข้ามาด้วย)")
ใช้เซตเก็บคูปอง ก็ไม่ต้องกลัวว่าจะเก็บซ้ำ (แล้วอย่าลิม strip ข้อมูลที่อ่านมาด้วย)
แบบฝึกหัด 10-2 ข้อที่ 10

จงเขียนฟังก์ชัน all_unique_alphabets(text) ที่รับ text เป็นสตริง แล้วคืนเซตของตัวอักษรอังกฤษทั้งหมด (a ถึง z) เฉพาะที่มีใน text (ให้ถือว่าตัวเล็กกับตัวใหญ่เหมือนกัน) เช่น all_unique_alphabets("555, Ha Ha Ha") ได้ {"h", "a"}

def all_unique_alphabets( text ): def all_unique_alphabets( text ): return set([c for c in text.lower() if "a"<=c<="z"]) q = "`" fname = "all_unique_alphabets" func = Ex().check_function_def(fname, missing_msg="ไม่พบฟังก์ชัน " + (q+fname+q)) func.has_equal_part_len('args', 'ฟังก์ชันนี้รับพารามิเตอร์ตัวเดียว') import random t = "".join([chr(random.randint(65, 75)) for i in range(20)]) args = ["Mamma Mia! (2018)", "Kill Bill: Vol. 1 (2003)", t] for a in args: fcall = fname + "('" + str(a) + "')" func.check_call(fcall).has_equal_value(incorrect_msg=(q+fcall+q) + " ให้ผลผิด") func.check_call(fcall).has_equal_value( expr_code = "type("+fcall+")", incorrect_msg="ต้องคืนเซต")
แบบฝึกหัด 10-2 ข้อที่ 11

จงเขียนฟังก์ชัน common_alphabets(t1, t2) ที่รับสตริง t1 และ t2 แล้วคืนลิสต์ของตัวอักษรอังกฤษทั้งหมด (a ถึง z) ที่มีทั้งใน t1 และ t2 (ให้ถือว่าตัวเล็กกับตัวใหญ่เหมือนกัน) โดยเรียงตัวอักษรจากน้อยไปมากตามพจนานุกรม เช่น common_alphabets("iPhone", "Huawei") ได้ ["e", "h", "i"]

def common_alphabets(t1, t2): def common_alphabets(t1, t2): s1 = set([c for c in t1.lower() if "a"<=c<="z"]) s2 = set([c for c in t2.lower() if "a"<=c<="z"]) return sorted(s1 & s2) q = "`" fname = "common_alphabets" func = Ex().check_function_def(fname, missing_msg="ไม่พบฟังก์ชัน " + (q+fname+q)) func.has_equal_part_len('args', 'ฟังก์ชันนี้รับพารามิเตอร์สองตัว') import random t1 = "".join([chr(random.randint(65, 75)) for i in range(10)]) t2 = "".join([chr(random.randint(65, 75)) for i in range(10)]) args = ["'Adolescent', 'Teenage'", "'"+t1+"', '"+t2+"'"] for a in args: fcall = fname + "(" + a + ")" func.check_call(fcall).has_equal_value(incorrect_msg=(q+fcall+q) + " ให้ผลผิด") func.check_call(fcall).has_equal_value( expr_code = "type("+fcall+")", incorrect_msg="ต้องคืนลิสต์")
แบบฝึกหัด 10-2 ข้อที่ 12

Pangram คือสตริงที่มีตัวอักษรอังกฤษทุกตัว (ใหญ่หรือเล็กก็ได้) เช่น "Pack my box with five dozen liquor jugs." จงเขียนฟังก์ชัน is_pangram(s) ที่รับสตริง s เพื่อตรวจว่า s เป็น pangram หรือไม่ หมายเหตุ: ให้เขียนฟังก์ชันนี้โดยใช้คำสั่งน้อย ๆ ไม่ต้องใช้วงวนและคำสั่ง if ใด ๆ

def is_pangram(s): def is_pangram(s): alphabets = 'abcdefijklmnopqrstuvwxyz' return set(alphabets) <= set(s.lower()) q = "`" fname = "is_pangram" 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|if)"), msg="ไม่ใช้ for หรือ while หรือ if นะ") import random t = "".join([chr(random.randint(65, 65+27)) for i in range(50)]) args = ["'Aexizious'", "'The quick brown fox jumps over the lazy dog.'", "'"+t+"'", ] for a in args: fcall = fname + "(" + a + ")" func.check_call(fcall).has_equal_value(incorrect_msg=(q+fcall+q) + " ให้ผลผิด")
คิดถึงเซต และการทดสอบ issubset