โจทย์: โครงสร้างข้อมูลซ้อนใน#
เรื่องลิสต์ซ้อนลิสต์#
ข้อ 1 - คะแนนรวม#
สมมติว่าเรามีข้อมูลคะแนนสอบของนักเรียนตลอดหนึ่งเทอม เขียนฟังก์ชันที่คำนวณว่านักเรียนแต่ละคนสอบผ่านหรือไม่ โดยใช้เกณฑ์ดังนี้
คะแนน  | 
เกรด  | 
|---|---|
>=60  | 
ผ่าน  | 
<60  | 
ไม่ผ่าน  | 
อินพุตที่ได้มาเป็นลิสต์ของลิสต์ของคะแนนของนักเรียนแต่ละคน เพราะฉะนั้นอินพุตเป็นโครงสร้างข้อมูลประเภทลิสต์ของลิสต์ของเลขจำนวนเต็ม
ให้ฟังก์ชันคืนค่าลิสต์ของบูลีนที่ระบุว่านักเรียนแต่ละคนผ่านวิชานี้หรือไม่
def sum_scores(score_lists):
    """
    
    >>> sum_scores([[10, 15, 30, 15], [2, 12, 25, 18]])
    [True, False]
    """
    return []
ข้อ 2 - ประมวลผลประโยค 1#
เขียนฟังก์ชันที่เปลี่ยนลิสต์ของประโยคที่ยังไม่ได้มีการตัดคำ ให้เป็นลิสต์ของลิสต์ของคำ (สตริง) โดยใช้คำสั่ง .split(' ')
def process_paragraph(sentence_list):
    """
    
    >>> process_paragraph(['This is a sentence.', 'This is another sentence.'])
    [['This', 'is', 'a', 'sentence.'], ['This', 'is', 'another', 'sentence.']]
    """
    return []
ข้อ 3 - ประมวลผลประโยค 2#
เขียนฟังก์ชันที่เปลี่ยนลิสต์ของประโยคที่ยังไม่ได้มีการตัดคำ ให้เป็นลิสต์ของจำนวนคำ จากนั้นให้คืนค่าทูเปิลที่มีค่าต่ำสุดและค่าสูงสุด
กระบวนการนี้เป็นกระบวนการที่เราทำบ่อยๆ เวลาประมวลผลประโยคเพื่อตรวจสอบว่ามีประโยคที่สั้นเกินไปหรือไม่ซึ่งอาจจะเกิดจากตอนดึงข้อมูลแล้วเกิดการผิดพลาด
def get_min_max_sentence_length(sentence_list):
    """
    
    >>> get_min_max_sentence_length(['short sentence.', 'This is a very long long long sentence.', 'a normal sentence here', 'another normal sentence'])
    (2, 8)
    """
    return (0, 0)
ข้อ 4 - ประมวลผลประโยค 3#
เวลาเราประมวลผลข้อมูลที่เป็นประโยคเราจะตัดประโยคที่สั้นเกินไปออก เพราะว่าอาจจะเกิดจากความผิดพลาด และอาจจะเป็นประโยคที่ไม่ได้สื่อความหมายมาก นอกจากนั้นแล้วเรามักจะจำกัดความยาวของประโยคที่เราต้องการจะวิเคราะห์อีกด้วยไม่ให้มีความยาวเกินไป
จงเขียนฟังก์ชันที่รับอาร์กิวเมนต์ 3 ตัว
ลิสต์ของประโยคที่ยังไม่ได้มีการตัดคำ
จำนวนคำขั้นต่ำที่ของประโยคที่ต้องการ
จำนวนคำสูงสุด
คืนค่าลิสต์ของประโยคที่มีความยาวมากกว่าจำนวนคำที่กำหนด และถ้าหากประโยคมีความยาวเกิดจำนวนคำสูงสุดให้เก็บไว้เฉพาะคำแรก ๆ ตัดเอาคำที่เกินทิ้งไป
def limit_sentence_lengths(sentence_list, min_words, max_words):
    """
    รับลิสต์ของประโยค และกรองประโยคตามจำนวนคำขั้นต่ำและสูงสุดที่กำหนด
    >>> limit_sentence_lengths(['short sentence', 'This is a very long long long sentence', 'a normal sentence here', 'another normal sentence'], 2, 4)
    ['This is a very', 'a normal sentence here', 'another normal sentence']
    """
    return []
ข้อ 5 - ประมวลผลประโยค 4#
เขียนฟังก์ชันเพื่อแปลงข้อมูลให้อยู่ในรูปของลิสต์ของลิสต์ของคำ โดยที่อินพุตที่ได้รับมาเป็นลิสต์ของประโยค ซึ่งแต่ละประโยคเป็นสตริงที่ถูกแบ่งคำไว้แล้ว แต่ละคำคั่นด้วย | โดยที่ให้กรองคำที่อยู่ในเซ็ตของคำที่ต้องการกรองออก และกรองคำที่ไม่ใช่ตัวอักษรภาษาไทยออกไปโดยใช้เรกเอกซ์ [ก-์]
import re
def tokenize_clean(sentences, stopset):
    """
    >>> tokenize_clean(['ฉัน|รัก|การ|เขียน|โปรแกรม|Python', 'ใน|ที่|สุด|ก็|สำเร็จ'],  {'ฉัน', 'การ', 'ใน', 'ที่', 'ก็'}) 
    [['รัก', 'เขียน', 'โปรแกรม'],  ['สำเร็จ']]
    """ 
    return []
ข้อ 6 - ประมวลผลประโยค 5#
จงเขียนฟังก์ชันเพื่อวิเคราะห์ลิสต์ของประโยค ซึ่งแต่ละประโยคเป็นลิสต์ของสตริงคำ ฟังก์ชันจะต้องคำนวณว่าแต่ละประโยคมีคำที่สั้นกว่าสามตัวอักษรคิดเป็นร้อยละเท่าไร (จำนวนคำที่สั้นกว่าสามตัวอักษร หารด้วยจำนวนคำทั้งหมด) และคืนค่าที่คำนวณออกมาได้
def calculate_ratio_3_chars(sentences):
    """
    >>> calculate_ratio_3_chars([['Stay', 'in', 'the', 'middle'],['Like','you', 'a', 'little'], ["Don't", 'want','no','riddle']])
    0.25
    """
    return 0
ข้อ 7 - หาชื่อเล่นผู้ชาย#
สมมติว่าเรามีข้อมูลชื่อของนิสิตปัจจุบันซึ่งเก็บไว้ในลิสต์ของทูเปิล (ชื่อจริง, ชื่อเล่น, เพศ) จงเขียนฟังก์ชันที่คืนค่าลิสต์ที่มีชื่อเล่นของผู้ชายเรียงลำดับตามพจนานุกรม และไม่ซ้ำกัน
def get_male_nicknames(students):
    """
    >>> get_male_nicknames([('Maysa', 'May', 'Female'),('Waruntorn', 'Ing', 'Female'),('Maysaya', 'May', 'Female'), ('Watsakorn', 'May', 'Female'),('Chonkan', 'Atom', 'Male'),('Saran', 'Ton', 'Male'), ('Tonkid', 'Ton', 'Male')])
    ['Atom', 'Ton']  
    """
    return []
เรื่องลิสต์ของดิกชันนารีคู่ฟิลด์แวลู#
ข้อ 1 - ความนิยม#
เขียนฟังก์ชันหาจำนวนคอมเมนต์ของไอดีแอ็กเคานต์ที่กำหนดให้ โดยที่ทวีตถูกเก็บอยู่ในรูปดิกชันนารีคู่ฟิลด์แวลู
data = [ {'id': 'BarackObama', 'date': 'October 17, 2019', 'num comments': 243000,
  'num retweets': 37000, 'num fav': 250300, 'text': 'I was proud to work with Justin Trudeau as President'},
 {'id': 'SpeakerPelosi', 'date': 'October 17, 2019', 'num comments': 22700,
  'num retweets': 10000, 'num fav': 45600, 'text': 'What courage does it take to pass legislation that will save lives?'},
 {'id': 'BarackObama', 'date': 'October 15, 2019', 'num comments': 2000,
  'num retweets': 5000, 'num fav': 52800, 'text': 'In December, Michelle and I will head to Malaysia for the first @ObamaFoundation Leaders: Asia-Pacific gathering'}
]
def sum_comments_for_id(tweet_id, tweet_list):
    """
    
    >>> sum_comments_for_id('BarackObama', data)
    42000
    """
    return 0
ข้อ 2 - การปิดกั้นสื่อ#
สมมติว่าเราได้รับข้อมูลเกี่ยวกับเว็บไซต์ที่ถูกปิดกั้นมาจากองค์กรหนึ่งในรูปแบบของลิสต์ของดิกชันนารีคู่ฟิลด์แวลู แต่ว่าข้อมูลชุดนี้ต้องได้รับการอัพเดท จงเขียนฟังก์ชันที่คืนค่าลิสต์ของดิกชันนารีคู่ฟิลด์แวลูที่มีการอัพเดทดังนี้
เว็บไซต์ที่ฟิลด์ ‘title’ มีคำว่า ‘men’ หรือคำว่า ‘women’ จะต้องถูกเอาออกจากลิสต์
เว็บไซต์ที่ฟิลด์ ‘url’ มี ‘.co.th’ และจำนวนผู้เข้าชมรวมทุกประเทศมากกว่า 30000 ให้เพิ่มฟิลด์ ‘big Thai site’ และตั้งค่าเป็น True ถ้าหากไม่ตรงเงื่อนไขให้ตั้งค่าเป็น False
ลบฟิลด์ ‘viewer’ ออก (ใช้ dict.pop)
ตัวอย่าง input:
data = [
{'title': 'Hottest men for you on this site', 'url': 'www.hotthing.com', 
 'viewer': {'thai': 1000, 'malaysia': 100, 'singapore': 600} },
{'title': 'Welcome to Zentrale', 'url': 'www.zen-zen.co.th', 
 'viewer': {'thai': 40000, 'malaysia': 10000, 'singapore': 600} },
{'title': 'Apply now for better life', 'url': 'www.betterlife.co.th', 
 'viewer': {'thai': 100, 'malaysia': 700, 'singapore': 200} },
{'title': 'We have everything you want.', 'url': 'www.everything.com', 
 'viewer': {'thai': 10000, 'malaysia': 20000, 'china': 60000} }
]
def tag_thai_sites(site_dict_list):
    """
    >>> tag_thai_sites(data)
    [
    {'title': 'Welcome to Zentrale', 'url': 'www.zen-zen.co.th','big Thai site': True},
    {'title': 'Apply now for better life', 'url': 'www.betterlife.co.th', 'big Thai site': False },
    {'title': 'We have everything you want.', 'url': 'www.everything.com', 'big Thai site': False}
    ]
    """
    return []
เรื่องดิกชันนารีซ้อนใน#
ข้อ 1 - รายชื่อ#
จงเขียนโปรแกรมที่สร้างลิสต์ของทูเปิล (name, line id) จากดิกชันนารีซ้อนใน โดยเรียงลำดับตามอักษรของชื่อ
def list_contact(contacts):
    """
    
    >>> list_contact({
    'Alex' : {'phone': '123-456-789', 'line': 'alexcool'},
    'Bo': {'home phone': '111-222-3333', 'line': 'bobo'},
    'Chris': {'phone': '444-555-6666', 'line': 'chrissie'},
    'Doug': {'mobile phone': '444-555-6666', 'line': 'dougd'}   
    })
    [('Alex', 'alexcool'), ('Bo', 'bobo'), ('Chris', 'chrissie'), ('Doug', 'dougd')]
    """
    return []
ข้อ 2 - ทูเปิลเป็นคีย์#
สมมติว่าเราได้ข้อมูลเบอร์โทรศัพท์ที่เก็บอยู่ในดิกชันนารีที่มีคีย์เป็นทูเปิลของชื่อและนามสกุล และแวลูเป็นสตริงที่เก็บเบอร์โทรศัพท์
จงเขียนฟังก์ชัน lookup_by_lastname ที่รับนามสกุลที่เป็นสตริง และดิกชันนารีข้อมูลเบอร์โทรศัพท์ และคืนค่าเบอร์โทรศัพท์ของคนที่มีนามสกุลที่กำหนดให้ ถ้าเกิดว่านามสกุลนั้นไม่มีอยู่ในดิกชันนารีให้คืนค่า None
def lookup_by_lastname(last_name, data):
    """
    
    >>> name_to_phone =  { ('Mark', 'Wahlberg') : '111-222-3333',
        ('Jane', 'Doe'): '222-333-4444',
        ('Jane', 'Eyre'): '333-444-5555'
        }
    >>> lookup_by_lastname('Doe', name_to_phone_numbers)
    '222-333-4444'
    """
    return None
ข้อ 3 - Name to age - Age to name#
เปลี่ยนจาก
name_to_age = {'ชญา': 33, 
         'อรรถพล': 34,
         'โนโซมิ': 34}
ให้เป็น
age_to_name = {33: ['ชญา'], 
         34: ['อรรถพล', 'โนโซมิ']
name_to_age = {'ชญา': 33, 
         'อรรถพล': 34,
         'โนโซมิ': 34}
ข้อ 4 - เปลี่ยนคีย์#
เปลี่ยนโครงสร้างของดิกชันนารีจากที่เคยมีคีย์เป็นทูเปิล (first name, last name) เป็นแค่ last name อย่างเดียว
name_to_phone = { ('Mark', 'Wahlberg') : '111-222-3333',
  ('Jane', 'Doe'): '222-333-4444',
  ('Jane', 'Eyre'): '333-444-5555'
}
ข้อ 5 - นับจำนวนนักเรียน#
สมมติว่าเรามีข้อมูลการลงทะเบียนเรียนในดิกชันนารีที่มีคีย์เป็นสตริงที่เก็บชื่อวิชา และแวลูเป็นลิสต์ของสตริงที่เก็บชื่อนักเรียนที่ลงเรียนวิชานั้นอยู่
จงเขียนฟังก์ชันที่คืนค่าลิสต์ของชื่อนักเรียนทั้งหมดที่ไม่ซ้ำกัน
def list_all_students(registration):
    """
    >>> registration = {'CompLing': ['Andy', 'Brittney', 'Catherine'],
        'SoundSys': ['Andy', 'Brittney', 'Donald', 'Elaine', 'Fodor'],
        'GramSys': ['Brittney', 'Girth', 'Harry'],
        'ManGeog': ['Andy', 'Donald', 'Girth']
    }
    >>> list_all_students(registration)
    ['Andy', 'Brittney', 'Catherine', 'Donald', 'Elaine', 'Fodor', 'Girth', 'Harry']
    """
    return []
ข้อ 6 - ใครชอบเรียนเยอะ#
สมมติว่าเรามีข้อมูลการลงทะเบียนเรียนในดิกชันนารีที่มีคีย์เป็นสตริงที่เก็บชื่อวิชา และแวลูเป็นลิสต์ของสตริงที่เก็บชื่อนักเรียนที่ลงเรียนวิชานั้นอยู่
จงเขียนฟังก์ชันที่คืนค่าดิกชันนารีที่คีย์คือจำนวนคลาสที่เรียนต่อคน และแวลูคือคนที่ลงเรียนจำนวนคลาสเท่ากับคีย์
def get_num_classes_to_students(registration):
    """
    
    Example:
    >>> registration = {'CompLing': ['Andy', 'Brittney', 'Catherine'],
        'SoundSys': ['Andy', 'Brittney', 'Donald', 'Elaine', 'Fodor'],
        'GramSys': ['Brittney', 'Girth', 'Harry'],
        'ManGeog': ['Andy', 'Donald', 'Girth']
    }
    >>> get_num_classes_to_students(registration)
    {3: ['Andy', 'Brittney'],
    2: ['Donald', 'Girth'],
    1: ['Catherine', 'Elaine', 'Fodor', 'Harry']}
    """
    return {}
ข้อ 7 - รวมดิกชันนารี#
จงเขียนฟังก์ชัน combine_dicts ที่รวมดิกชันนารีสองอันเข้าไว้ด้วยกัน โดยที่ดิกชันนารีมีคีย์และแวลูเป็นสตริง ฟังก์ชันต้องคืนค่าดิกชันนารีที่มีคีย์เป็นสตริงและแวลูเป็นลิสต์ของสตริง เช่น
dict1 = {'a': 'ant', 'b': 'bird', 'c':'caterpillar'}
dict2 = {'a': 'ant', 'c': 'cat', 'd': 'dog'}
combine_dicts(dict1 , dict2)
>>> {'a': ['ant', 'ant'], 
     'b': ['bird'], 
     'c': ['caterpillar','cat'], 
     'd':['dog']}
แวลูที่คู่กับ 'c' เป็นลิสต์ที่มี 'catepillar' ซึ่งมาจาก dict1 และ 'cat' ซึ่งมาจาก dict2
แวลูที่คู่กับ 'd' เป็นลิสต์ที่มี 'dog' ซึ่งมาจาก dict2 เพราะว่า dict1 ไม่มีคีย์ 'c' อยู่
def combine_dicts(d1, d2):
    return {}
ข้อ 8 - ใครไม่ส่งการบ้าน#
สมมติว่าเรามีข้อมูลการส่งงานของนิสิต เก็บอยู่ในดิกชันนารีที่มีคีย์เป็นสตริงที่เก็บชื่อการบ้านทั้งหมด และแวลูเป็นลิสต์ของสตริงที่เก็บชื่อนิสิตที่ส่งการบ้านชิ้นนั้นแล้ว จงเขียนฟังก์ชันที่คืนค่าลิสต์ของชื่อนิสิตที่ส่งการบ้านไม่ครบ
def find_missing_work(data):
    """
    >>> find_missing_work( {'PA1': ['Bew', 'Mild', 'Nipun'],
        'PA2': ['Mild', 'Bew', 'PP'],
        'PA3': ['Bew', 'Nipun', 'Mild'] } )
    ['Nipun', 'PP']
    """
    return []